for循环删除list集合的问题及解决方案

1. 概述

在开发过程中,有时候会有这样的需求,就是在一个 listview或者recyclerview 列表中,需要将选中的item删除,这里就是涉及到如何删除选中item,


for循环删除list集合的问题及解决方案_第1张图片
图片.png

常用的有以下几种方案:
方案1>:for循环删除:注意从大到小遍历,不是从小到大;
方案2>:迭代器方式删除;
方案3>:定义一个临时的集合tempList,把选中的item添加到tempList集合中,然后用 list.removeAll(tempList),从原始集合list中直接移除就可以;

for循环删除 从小到大 的问题:

比如list集合中有12个数据,需求是删除角标为 1, 8,12的数据,如果从小到大遍历删除,删除角标为1元素,8位置就变为7了,删除位置变了,会造成角标空指针问题或者其他问题,所以一般不用for循环从小到大删除,如果想用,可以用for循环从大到小删除数据即可;

2. 解决方案

方案1>:for循环删除:注意从大到小遍历,不是从小到大;
    /**
     * 删除选中项
     */
    private void deleteCheckedItem() {
        // list:初始化所有的数据;count:最后角标
        int count = list.size() - 1 ;
        //从大到小遍历,否则,从小到大遍历的话会出现错位
        for (int i = count ; i >= 0 ; i--) {
            // 只要有选中的,就从list中移除位置
            if (boxList.get(i).isChecked()){
                list.remove(i);
            }
        }
    }
方案2>:迭代器方式删除:
Iterator it = appAdapter.getData().iterator();
while (it.hasNext()) { 
      Appli appli = (Appli) it.next(); 
      if (appli.isCheck) { 
          it.remove(); 
      } 
}
方案3>:定义一个临时的集合tempList:
if(list != null){
  // 定义临时集合,用于存储选中的数据
 List tempDeletelist = new ArrayList();
 for (MyCollectionBean.DataBean bean:list){
     boolean choosed = bean.isCheck;
    if (choosed) {
          tempDeletelist.add(bean) ;
    }
}

// 调用删除接口,删除成功后,从list中removeAll()移除tempList集合,然后刷新adapter即可:
list.removeAll(tempDeletelist) ;
mAdapter.notifyDataSetChanged();

你可能感兴趣的:(for循环删除list集合的问题及解决方案)