RecyclerView长按条目进行批量删除

因为最近接手了一个有关阅读类的项目,但是这个项目中没有删除书籍  
    的功能,所以老大就让我在这个项目上添加一个长按条目进行批量删除  
    的功能,这个功能首先我想到的就是弹出一个取消和确定的布局,再用  
    CheckBox来进行操作,然后加上逻辑代码进行实现.首先说明这个  
    RecyclerView用的是GridLayoutManager,其实其他也都大同小  
    异,接下来我就贴下代码,我只贴主  要业务逻辑代码,其它的就不贴在  
    上面了.

首先是自己写一个进行删除的时候弹出的delete_title,在activity的布局上include下,不过要把它设为GONE.(因为我这个项目是直接用布局写的一个title,所以我也是用布局写的delete_title;如果你们上面用ToolBar或ActionBar可以使用ActionMode来进行设置),这里布局就不写了,下面我开始来上代码了.

首先要定义一个Boolean值来控制delete_title布局和CheckBox的显示或者消失.条目的javabean中要添加public boolean isChecked属性,后面可以用来判断哪些数据需要删除;

public class HomeRecyclerViewAdapter extends RecyclerView.Adapter {

    public boolean isDelete = false;
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
         //设置checkBox的显示或者消失
        mHolder.checkBox.setVisibility(isDelete?View.VISIBLE:View.INVISIBLE);
        mHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked){
                    ebook.isChecked = true;
                }else {
                    ebook.isChecked = false;
                }
            }
        });
        mHolder.checkBox.setChecked(ebook.isChecked);

mHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                isDelete = true;
                mOnItemLongClickListener.onItemLongClickListener();
                return true;
            }
        });
  }
}

   public interface OnItemLongClickListener{
        void onItemLongClickListener();
    }

    private OnItemLongClickListener mOnItemLongClickListener;

    public void setOnItemLongClickListener(OnItemLongClickListener mOnItemLongClickListener) {
        this.mOnItemLongClickListener = mOnItemLongClickListener;
    }

Fragment中的代码,注意我只贴了和批量删除的逻辑代码,一些设置较为简单的代码我就没有直接贴上去,看的时候注意.

public class BookShelfFragment extends BaseFragment implements HomeRecyclerViewAdapter.OnItemLongClickListener, View.OnClickListener {
        @Override
    public void onItemLongClickListener() {
        if (recylerViewAdapter.isDelete) {
            ((HomeActivity) getActivity()).findViewById(R.id.rl_title).setVisibility(View.GONE);
            ((HomeActivity) getActivity()).findViewById(R.id.title_delete).setVisibility(View.VISIBLE);
            notifyDataChanged();
        } else {
            ((HomeActivity) getActivity()).findViewById(R.id.rl_title).setVisibility(View.VISIBLE);
            ((HomeActivity) getActivity()).findViewById(R.id.title_delete).setVisibility(View.GONE);
            notifyDataChanged();
        }
    }

    public Boolean getTitleState() {
        return recylerViewAdapter.isDelete;
    }

    public HomeRecyclerViewAdapter getRecylerViewAdapter() {
        return recylerViewAdapter;
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.title_delete_cancel:
                ((HomeActivity) getActivity()).findViewById(R.id.rl_title).setVisibility(View.VISIBLE);
                ((HomeActivity) getActivity()).findViewById(R.id.title_delete).setVisibility(View.GONE);
                recylerViewAdapter.isDelete = false;
                for (int i = 0; i < DataEngine.getInstance().dataSet.size(); i++) {
                    Ebook ebook = DataEngine.getInstance().dataSet.get(i);
                    ebook.isChecked = false;
                }
                notifyDataChanged();
                break;
            case R.id.title_delete_confirm:
                ArrayList<Ebook> deleteList = new ArrayList<>();
                for (int i = 0; i < DataEngine.getInstance().dataSet.size(); i++) {
                    Ebook ebook = DataEngine.getInstance().dataSet.get(i);
                    if (ebook.isChecked) {
                        String path = APP.CACHE_DIR + File.separator + ebook.BookName;
                        File file = new File(path);
                        final File unzipFile = new File(file.getParent() + File.separator + file.getName() + "data");
                        if (unzipFile.exists()) {
                            deleteFile(unzipFile);
                        }
                        deleteList.add(ebook);
                    }
                }
                if (deleteList.size()!=0) {
                    ((HomeActivity) getActivity()).findViewById(R.id.title_delete).setVisibility(View.GONE);
                    ((HomeActivity) getActivity()).findViewById(R.id.rl_title).setVisibility(View.VISIBLE);
                    recylerViewAdapter.isDelete = false;
                    DataEngine.getInstance().scanCacheForData(APP.CACHE_DIR);
                    for (BaseActivity activity : APP.activities) {
                        activity.notifyDataChanged();
                    }
                }else {
                    Toast.makeText(getActivity(),"请选择书籍",Toast.LENGTH_SHORT).show();
                }
                break;
        }
    }

    //删除下载书籍
    private void deleteFile(File file) {
        if (file.isFile()) {
            file.delete();
            return;
        }

        if (file.isDirectory()) {
            File[] childFiles = file.listFiles();
            if (childFiles == null || childFiles.length == 0) {
                file.delete();
                return;
            }
            for (int i = 0; i < childFiles.length; i++) {
                deleteFile(childFiles[i]);
            }
            file.delete();
        }
    }
}

最后在按返回键的需要进行监听恢复(这个是activity中的代码)

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            if (bookShelfFragment.getTitleState()){
                bookShelfFragment.getRecylerViewAdapter().isDelete = false;
                mHolder.title.setVisibility(View.VISIBLE);
                mHolder.titleDelete.setVisibility(View.GONE);

                for (int i = 0; i < DataEngine.getInstance().dataSet.size(); i++) {
                    Ebook ebook = DataEngine.getInstance().dataSet.get(i);
                    ebook.isChecked = false;
                }
                bookShelfFragment.notifyDataChanged();
                return false;
            }

            if (isExit) {
                finish();
            } else {
                isExit = true;
                ToastUtil.showSingleInstance(this, "再按一次退出");
                Handler handler = new Handler();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        isExit = false;
                    }
                }, 2000);
            }
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }