【问题标题】:delete selected list items删除选定的列表项
【发布时间】:2014-06-18 05:59:48
【问题描述】:

我在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();

【问题讨论】:

标签: android listview fragment


【解决方案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));
    }
}

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      保留适配器的引用和用于创建适配器的数据列表,最好使用 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();
      

      【讨论】:

      • 坦克,适配器工作良好,但我的删除没有工作,这是我的代码:SparseBooleanArray checkedItems = listView.getCheckedItemPositions(); for(int i=0;i
      • 您的SparseBooleanArray 将包含对应于每个位置的布尔数组,如果它是真的项目被选中,否则它被取消选中。因此,在检查项目时将其移除,并且在内部移除时,您必须通过该位置。我现在已经编辑了答案检查。
      • 如果我选择 3 个项目,它会删除前 3 个项目!,而不是选定的项目,如果我选择所有项目并按删除,应用程序将崩溃,我该怎么办?
      • 您可以调试并查看checkedItems 数组中的值吗?您是否为您的列表视图设置选择模式CHOICE_MODE_NONE
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-24
      • 2019-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多