记一次多选删除的逻辑判断以及操作流程

首次加载数据之后初始化Map集合,我使用的treeMap

    /**
     * 初始化map集合,默认为不选中
     */
    private void initMap(boolean flag) {

        for (int i = 0; i < mAdapter.getData().size(); i++) {
            deleteMap.put(i, flag);
        }
    }

Adapter配置方法用于判断checkBox是否显示,默认false,不显示

        private boolean flag = false;

        /**
         * checkBox是否出现
         *
         * @param flag checkBox是否出现
         */
        private void changeFlag(boolean flag) {

            this.flag = flag;
        }

适配器内用于判断,是否显示

 if (flag ) {
 
    checkBox.setVisibility(View.VISIBLE);
    
    } else {
    
      checkBox.setVisibility(View.GONE);
     }
     

添加点击事件用于更新map

 checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                   
                    deleteMap.put(position, isChecked);
                }
            });

通过map对应的值,用于更新checkBox是否要勾选的状态

 if (View.VISIBLE == checkBox.getVisibility()) {

               checkBox.setChecked(deleteMap.get(position));
            }

设置点击跳转,删除装天下点击既为勾选,更新map数据,通知适配器

deleteMap.put(position, true);

mAdapter.notifyDataSetChanged();

长按状态下,变为删除状态,删除状态下,长按直接return turn;变为删除状态,显示checkBox,显示取消和全选view,更新该条数据为勾选状态,通知适配器

mAdapter.changeFlag(true);
                                        deleteView.setVisibility(View.VISIBLE);
                                        deleteMap.put(position, true);
                                        mAdapter.notifyDataSetChanged();

点击取消,首先清空map数据,重新赋值全部为false,隐藏checkBox,再通知适配器,隐藏全选view(关于,不清空,直接重新赋值,因为删除数据之后map长度会有变化(赋值根据新的数据长度)),删除成功之后也是要重新赋值

 deleteMap.clear();
 initMap(false);
 mAdapter.changeFlag(false);
 mAdapter.notifyDataSetChanged();
 deleteView.setVisibility(View.GONE);

全选按钮,首先清空集合,重新赋值,全部为true,再通知适配器

 deleteMap.clear();
 initMap(true);
 mAdapter.notifyDataSetChanged();

点击删除时,遍历map,使用StringBuilder拼接要删除的条目ID

 StringBuilder workId = new StringBuilder();
        for (Map.Entry map : deleteMap.entrySet()) {
            if (map.getValue()) {
                String string = mAdapter.getData().get(map.getKey()).getWorkId() + ";";
                workId.append(string);
            }
        }

删除成功后倒叙删除适配器中所删除的条目,清空map集合,重新赋值,全部为false,隐藏checkBox和全选view以及通知适配器

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

      if (deleteMap.get(i)) {
          mAdapter.remove(i);
      }
  }
   
 deleteMap.clear();
 initMap(false);
 mAdapter.changeFlag(false);
 mAdapter.notifyDataSetChanged();
 deleteView.setVisibility(View.GONE);

另外隐藏和动态显示时,再xml中父view添加

android:animateLayoutChanges="true"

效果不会那么突兀

你可能感兴趣的:(记一次多选删除的逻辑判断以及操作流程)