RecyclerView實現多選

最近在做項目時遇到一個小功能,實現多選的功能。剛拿到時首先想到的是看能不能直接在Adapter中設置item的選中狀態,簡單查了下API發現沒有這樣的函數供我們使用。google了下,在GitHub上找到了drag-select-recyclerview可以輕松實現RecyclerView的多選。

期望的效果圖
如何使用

drag-select-recyclerview的使用還是非常簡單的,我們添加依賴后發現drag-select-recyclerview內容非常簡單,主要由DragSelectRecyclerView與DragSelectRecyclerViewAdapter組成,這兩個類共同協作提供了我們想要的功能。

目錄結構
DragSelectRecyclerView

DragSelectRecyclerView繼承了RecyclerView且在布局文件中取代了RecyclerView,所以,你需要在xml中引入該組件。

<com.afollestad.dragselectrecyclerview.DragSelectRecyclerView
        android:id="@+id/base_info_recycler"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
</com.afollestad.dragselectrecyclerview.DragSelectRecyclerView>

與RecyclerView一樣,同時你也需要設置LayoutManager與Adapter

mRecycler.setLayoutManager(new GridLayoutManager(mContext,3));
mRecycler.setAdapter(mAdapter);

不同的是,此時的Adapter必須為DragSelectRecyclerViewAdapter的子類。

DragSelectRecyclerViewAdapter

在Adapter中關鍵點在于通過isIndexSelected方法來判斷item是否被選擇。

@Override
    public void onBindViewHolder(MyViewHolder holder, final int position) {
        super.onBindViewHolder(holder, position);
        if(isIndexSelected(position)){//item是否選擇
            holder.mImg.setImageResource(R.mipmap.match_item_city_icon);
        }else{
            holder.mImg.setImageResource(R.mipmap.icon_match_item_img);
        }
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                callBack.onBaseInfoItemClick(position);
            }
        });
    }
Activity調用

在Adapter Item回調方法中只需調用toggleSelected(index)來切換選擇

@Override
    public void onBaseInfoItemClick(int index) {
        mAdapter.toggleSelected(index);
    }

僅僅調用這一個方法就可以輕松實現多選?通過查詢此方法的內部實現可以看到:通過傳遞的index進行判斷,如果在選中列表中就將它移除,反之添加到選中列表中,隨后通知適配器刷新。在之前適配器中檢查item是否被選中也是通過這樣一個邏輯來判斷的。其內部實現邏輯還是蠻簡單易于理解的。

public final boolean toggleSelected(int index) {
        boolean selectedNow = false;
        if (isIndexSelectable(index)) {
            if (mSelectedIndices.contains(index)) {
                mSelectedIndices.remove((Integer) index);
            } else if (mMaxSelectionCount == -1 ||
                    mSelectedIndices.size() < mMaxSelectionCount) {
                mSelectedIndices.add(index);
                selectedNow = true;
            }
            notifyItemChanged(index);
        }
        fireSelectionListener();
        return selectedNow;
    }

通過源碼發現DragSelectRecyclerViewAdapter也提供了許多可選方法供我們使用,顧名思義,大多數外部調用的方法也比較容易理解。更多用法還需仔細研讀源碼...

DragSelectRecyclerViewAdapter目錄結構
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容