删除所选列表项

时间:2014-06-18 05:59:48

标签: android listview fragment

我有一个我在Fragment中使用的数组字符串,我在列表中显示了带有setListAdapter的数组字符串项:

  public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
 String[] array = getResources().getStringArray(R.array.examlearray);
        final ArrayList<String> str = new ArrayList<String>(Arrays.asList(array));
        final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1, str );
        setListAdapter(arrayAdapter);

  final ListView listView = getListView();       
        listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
        listView.setMultiChoiceModeListener(new MultiChoiceModeListener() {...

并在我的onActionItemClicked下我想实现我的 deleteSelectedItem()方法,删除所选列表项,这是我的代码,但它没有删除所选项,它是只需从列表的第一个删除,当我选择所有项目并按删除,应用程序崩溃!应该怎么做?,任何帮助将不胜感激!谢谢!

 public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
                // Respond to clicks on the actions in the CAB
                switch (item.getItemId()) {
                    case R.id.delete:
                    //    deleteSelectedItems();

                         Log.i(TAG, "deleteSelectedEntries");
                         SparseBooleanArray checkedItems = listView.getCheckedItemPositions();
for(int i=0;i<checkedItems.size();++i)

                         { if(checkedItems.valueAt(i))
                             str.remove(i);

                         }
                         arrayAdapter.notifyDataSetChanged();

3 个答案:

答案 0 :(得分:1)

您不必遍历从listView.getCheckedItemPositions()获得的SparseBooleanArray,而是必须循环遍历ArrayAdapter的项目,然后检查SparseBooleanArray是否为此项目返回true。这是因为当您从ArrayAdapter中删除项目时,listView.getCheckedItemPositions()仍然会返回不再存在的项目。

所以在你的情况下:

SparseBooleanArray checkedItems = listView.getCheckedItemPositions();
// Loop backwards, so you can remove the items from within the loop
for (int i = arrayAdapter.getCount() - 1; i >= 0; i--) {
    if (checkedItems.get(i)) {
        // This item is checked and can be removed
        arrayAdapter.remove(arrayAdapter.getItem(i));
    }
}

您的应用崩溃的原因是您尝试删除不存在的项目。

答案 1 :(得分:0)

您需要保留对阵列适配器的引用。然后尝试调用适配器上的remove函数,然后调用notifyDataSetChanged。如果您只提及该职位,则还需要使用getItem

答案 2 :(得分:0)

保留用于创建适配器的适配器和数据列表的引用,最好使用ArrayList,因为它可以灵活地轻松删除元素。要设置适配器,您可以使用以下代码 -

String[] array = getResources().getStringArray(R.array.examlearray);
ArrayList<String> str = new ArrayList<String>(Arrays.asList(array));
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1, str );
menuListView.setAdapter(arrayAdapter);

要删除元素,首先从数据列表中删除元素,然后调用notifyDatasetChnaged也将更新listView。您可以在onActionItemClicked

中调用以下代码
`for(int i=0;i<checkedItems.size();++i) 
      {  if(checkedItems.valueAt(i))
              str.remove(i);
      }

arrayAdapter.notifyDataSetChanged();