如何删除所选列表项?

时间:2014-06-24 06:32:15

标签: android android-listview

我有一个我在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()方法,该方法会从我选择的列表中删除项目,这是我的代码,但它没有删除所选项目,它只是从列表的第一个删除,它想要的地方!!!我该怎么办?,任何帮助将不胜感激!谢谢!

 @Override
            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(listView.getItemAtPosition(i));
                         }
                        }

                         arrayAdapter.notifyDataSetChanged();

                         mode.finish();
                         return true;
                      }

3 个答案:

答案 0 :(得分:1)

SparseBooleanArray的键表示列表视图中所选项目的位置。因此,而不是str.remove(listView.getItemAtPosition(i));使用str.remove(checkedItems.keyAt(i));

@Override
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(checkedItems.keyAt(i));
            }
    }

    arrayAdapter.notifyDataSetChanged();

    mode.finish();
    return true;
}

答案 1 :(得分:0)

在您的代码中,您将从最终的ArrayList str中删除(为什么如果您计划删除/更改数据,则将其声明为最终?)。

你需要使用

arrayAdapter.remove(listView.getItemAtPosition(i))

然后

arrayAdapter.notifyDataSetChanged();

答案 2 :(得分:0)

您的代码在很多情况下返回ArrayIndexOutOfBound

一个例子:

你有一个包含14个元素的列表,你可以选择它的第一个和最后一个索引。所以现在在for语句中你会通过你的列表并从中删除:

在这种情况下,您删除列表的第一个索引,因此列表的大小变为13,然后删除最后一个项目,您尝试访问列表中不存在的第14个元素

如何解决:

for(int i=checkedItems.size()-1 ;i>= 0;i--){

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