0

我有一个ListViewFragment内。我一直在尝试设置一个功能ContextMenu来删除和编辑条目。简单地通过saveAdapter.notifyDataSetChanged();返回null。传递ArrayAdapter<LiftSave> saveAdapter = new SaveListAdapter();导致消息:片段上下文菜单通知适配器

java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. Make sure your adapter calls notifyDataSetChanged() when its content changes. 

我会非常感谢任何洞察解决适配器,和/或任何建议的最佳做法设置的编辑选项。也许推出自定义AlertDialog?提前致谢。

片段:

public static class FragmentS extends Fragment { 

    private ListView saveListView; 
    private List<LiftSave> LiftSaves = new ArrayList<LiftSave>(); 
    private static final int EDIT = 0, DELETE = 1; 

    int longClickedItemIndex; 
    DatabaseHandler dbHandler; 
    ArrayAdapter<LiftSave> saveAdapter; 


    public FragmentS() { 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.listview_s, 
       container, false); 
     saveListView = (ListView) rootView.findViewById(R.id.saveListView); 
     registerForContextMenu(saveListView); 
     DatabaseHandler dbHandler; 
     dbHandler = new DatabaseHandler (getActivity().getApplicationContext()); 
     if (dbHandler.getLiftSavesCount() != 0) 
      LiftSaves.addAll(dbHandler.getAllLiftSaves()); 

     populateList(); 

     saveListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
      @Override 
      public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { 
       longClickedItemIndex = position; 
       return false; 
      } 
     }); 
     return rootView; 
    } 

    private void populateList() { 
     ArrayAdapter<LiftSave> saveAdapter = new SaveListAdapter(); 
     saveListView.setAdapter(saveAdapter); 
    } 

    public class SaveListAdapter extends ArrayAdapter<LiftSave> { 
      public SaveListAdapter() { 
       super(getActivity(), R.layout.listview_item, LiftSaves); 
      } 

      @Override 
      public View getView(int position, View view, ViewGroup parent) { 
       if (view == null) 
        view = getActivity().getLayoutInflater().inflate(R.layout.listview_item, parent, false); 

       LiftSave currentLiftSave = LiftSaves.get(position); 

       TextView liftName = (TextView) view.findViewById(R.id.liftName); 
       liftName.setText(currentLiftSave.getLiftName()); 
       TextView maxValue = (TextView) view.findViewById(R.id.maxValue); 
       maxValue.setText(currentLiftSave.getMaxValue()); 
       TextView weightAndReps = (TextView) view.findViewById(R.id.weightAndReps); 
       weightAndReps.setText(currentLiftSave.getRepsAndWeight()); 
       TextView liftNotes = (TextView) view.findViewById(R.id.liftNotes); 
       liftNotes.setText(currentLiftSave.getLiftNotes()); 
       TextView date = (TextView) view.findViewById(R.id.todayDate); 
       date.setText(currentLiftSave.getTodayDate()); 

       return view; 
      } 

    } 
    public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) { 
     super.onCreateContextMenu(menu, view, menuInfo); 

     menu.setHeaderIcon(R.drawable.pencil_icon); 
     menu.setHeaderTitle("Save Options"); 
     menu.add(Menu.NONE, EDIT, menu.NONE, "Edit Save"); 
     menu.add(Menu.NONE, DELETE, menu.NONE, "Delete Save"); 
    } 

    public boolean onContextItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case EDIT: 
       // TODO: Add save edit code 
       break; 
      case DELETE: 
       dbHandler = new DatabaseHandler (getActivity().getApplicationContext()); 
       dbHandler.deleteLiftSave(LiftSaves.get(longClickedItemIndex)); 
       LiftSaves.remove(longClickedItemIndex); 
       saveAdapter.notifyDataSetChanged(); 
       break; 
     } 

     return super.onContextItemSelected(item); 
    } 
} 

XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context=".TabbedActivity$FragmentS" 
android:background="@android:color/holo_blue_dark"> 

<LinearLayout 
android:id="@+id/tabSaveList" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" 
xmlns:android="http://schemas.android.com/apk/res/android"> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:text="Saved Maxes" 
    android:id="@+id/textView" 
    android:layout_gravity="center" 
    android:layout_marginTop="10dp" 
    android:textColor="#fffaf4a1" 
    android:textStyle="bold" /> 

<ListView 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:id="@+id/saveListView" /> 


</LinearLayout> 
</RelativeLayout> 

回答

0

变化int longClickedItemIndex;LiftSave longClickedItemLiftSave;

然后,在长按听者捕获该值作为longClickedItemLiftSave

 saveListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
     @Override 
     public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { 
      longClickedItemLiftSave = (LiftSave) parent.getItemAtPosition(position); 
      return false; 
     } 
    }); 

然后在你的菜单操作只需要调用ArrayAdapter#remove(T),这将调用notifyDataSetChanged

 case DELETE: 
      dbHandler = new DatabaseHandler (getActivity().getApplicationContext()); 
      dbHandler.deleteLiftSave(longClickedItemLiftSave); 
      saveAdapter.remove(longClickedItemLiftSave); 
      break; 

最后,改变你的populateList所以它使用的saveAdapter而不是一个局部变量片段的领域仅此方法。

private void populateList() { 
    saveAdapter = new SaveListAdapter(); 
    saveListView.setAdapter(saveAdapter); 
} 
+0

感谢您的输入,不幸的是它仍然为'ArrayAdapter'返回null。 'java.lang.NullPointerException:尝试在null对象引用 上的com.myapp.mytest.TabbedActivity $ FragmentS.onContextItemSelected(TabbedActivity。)上调用虚拟方法'void android.widget.ArrayAdapter.remove(java.lang.Object)'。的java:211)'。 – Austin

+0

@Austin我现在看到了剩余的问题,检查编辑(更改为'populateList') – petey

+0

这样做。谢谢! – Austin