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