最近在做項目時遇到一個小功能,實現多選的功能。剛拿到時首先想到的是看能不能直接在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也提供了許多可選方法供我們使用,顧名思義,大多數外部調用的方法也比較容易理解。更多用法還需仔細研讀源碼...