Recyclerview 實現多選,單選,全選,反選,批量刪除的功能的實現
阿新 • • 發佈:2018-12-06
不多說 demo傳送門https://download.csdn.net/download/godnessismymine/10774475
Recyclerview 實現多選,單選,全選,反選,批量刪除的步驟
1.在Recyclerview佈局中新增上底部的全選和反選按鈕,刪除按鈕,和計算數量等控制元件
2.這裡選中的控制元件沒有用checkbox來做,用的是imageview,選中和不選中其實是兩張圖片
3.預設是不顯示選中的控制元件的,點選編輯的時候顯示,點選取消的時候隱藏
4.通過adapter和activity資料之間的傳遞,然後進行具體的操作
具體程式碼如下:
在recyclerview的佈局中寫全選,反選,刪除,計數等相應的控制元件
<LinearLayout android:id="@+id/ll_mycollection_bottom_dialog" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:layout_gravity="bottom" android:visibility="gone" android:background="@color/app_bg"> <View android:background="#e5e5e5" android:layout_width="match_parent" android:layout_height="1px"/> <RelativeLayout android:background="@color/white" android:layout_width="match_parent" android:layout_height="@dimen/px_90"> <TextView android:layout_centerVertical="true" android:id="@+id/tv" android:textColor="#1A1A1A" android:textSize="@dimen/px_28" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="@dimen/px_30" android:text="@string/mine_certify_select" /> <TextView android:layout_centerVertical="true" android:layout_toRightOf="@+id/tv" android:textColor="#1A1A1A" android:textSize="@dimen/px_28" android:id="@+id/tv_select_num" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="@dimen/px_18" android:text="0" /> <Button android:textColor="@color/color_b7b8bd" android:textSize="@dimen/px_28" android:layout_centerVertical="true" android:background="@drawable/button__noclickable_shape" android:gravity="center" android:id="@+id/btn_delete" android:layout_width="@dimen/px_160" android:layout_height="@dimen/px_66" android:layout_marginRight="@dimen/px_30" android:layout_alignParentRight="true" android:text="刪除" /> <TextView android:layout_centerVertical="true" android:id="@+id/select_all" android:layout_marginRight="@dimen/px_30" android:background="@drawable/bg_selete_all" android:layout_toLeftOf="@+id/btn_delete" android:layout_width="@dimen/px_160" android:layout_height="@dimen/px_66" android:text="全選" android:gravity="center" android:textColor="#000001" android:textSize="@dimen/px_28"/> </RelativeLayout> </LinearLayout>
Adapter中的佈局就一個item,最左邊一個imageview.
<ImageView android:id="@+id/check_box" android:src="@mipmap/ic_uncheck" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginLeft="@dimen/px_24" android:gravity="center" android:visibility="gone"/>
佈局寫完開始寫邏輯程式碼
首先在adapter定義一個方法,以便在activity中拿到資料新增進adapter中
public void notifyAdapter(List<MyLiveList.MyLive> myLiveList,boolean isAdd){
if (!isAdd){
this.mMyLiveList=myLiveList;
}else {
this.mMyLiveList.addAll(myLiveList);
}
notifyDataSetChanged();
}
然後在activity中拿到獲取到資料後呼叫adapter中的這個方法,新增資料
mAdapter.notifyAdapter(data.getList(), false);
在adapter中在判空,更有保證
public List<MyLiveList.MyLive> getMyLiveList(){
if (mMyLiveList == null) {
mMyLiveList =new ArrayList<>();
}
return mMyLiveList;
}
然後adapter中的getItemCount就直接拿到上面這個mMyLiveList的大小就可以了
接下來開始點選編輯的時候顯示出imageview和recycleview中的底部全選反選部分
定義兩個變數
private static final int MYLIVE_MODE_CHECK = 0;
private static final int MYLIVE_MODE_EDIT = 1;
//點選編輯的時候顯示,順便調mAdapter.setEditMode(mEditMode);賦值
mEditMode = mEditMode == MYLIVE_MODE_CHECK ? MYLIVE_MODE_EDIT : MYLIVE_MODE_CHECK;
if (mEditMode == MYLIVE_MODE_EDIT) {
activity_btn.setText("取消");
ll_mycollection_bottom_dialog.setVisibility(View.VISIBLE);
editorStatus = true;
} else {
activity_btn.setText("編輯");
ll_mycollection_bottom_dialog.setVisibility(View.GONE);
editorStatus = false;
onRefresh();
}
mAdapter.setEditMode(mEditMode);
//當然,adapter中也有先關的變數在記錄
private static final int MYLIVE_MODE_CHECK = 0;
int mEditMode = MYLIVE_MODE_CHECK;
public void setEditMode(int editMode) {
mEditMode = editMode;
notifyDataSetChanged();
}
//在onBindViewHolder中做顯示和隱藏的操作.
holder.setIsRecyclable(false); // 為了條目不復用
//顯示和隱藏
if (mEditMode == MYLIVE_MODE_CHECK) {
holder.mCheckBox.setVisibility(View.GONE);
} else {
holder.mCheckBox.setVisibility(View.VISIBLE);
為了方便記錄選中的狀態,在bean裡面用個變數記起來
public boolean isSelect;
public boolean isSelect() {
return isSelect;
}
public void setSelect(boolean isSelect) {
this.isSelect = isSelect;
}
//然後點選條目選中和不選中的時候為Imageview設定不同的圖片
if(myLive.isSelect()) {
holder.mCheckBox.setImageResource(R.mipmap.ic_checked);
}else{
holder.mCheckBox.setImageResource(R.mipmap.ic_uncheck);
}
//在adapter中暴漏一個Item的點選事件的介面
public interface OnSwipeListener {
void onItemClickListener(int pos,List<MyLiveList.MyLive> myLiveList);
}
/*
在activity中的item點選事件中,來操作Imageview是否選中
*/
//用一個變數記錄
private int index = 0;
MyLive myLive = myLiveList.get(pos);
boolean isSelect = myLive.isSelect();
if (!isSelect) {
index++;
myLive.setSelect(true);
if (index == myLiveList.size()) {
isSelectAll = true;
selectAll.setText("取消全選");
}
} else {
myLive.setSelect(false);
index--;
isSelectAll = false;
selectAll.setText("全選");
}
setBtnBackground(index);
tv_select_num.setText(String.valueOf(index));
radioAdapter.notifyDataSetChanged();
/**
* 根據選擇的數量是否為0來判斷按鈕的是否可點選.
*
* @param size
*/
private void setBtnBackground(int size) {
if (size != 0) {
mBtnDelete.setBackgroundResource(R.drawable.button_shape);
mBtnDelete.setEnabled(true);
mBtnDelete.setTextColor(Color.WHITE);
} else {
mBtnDelete.setBackgroundResource(R.drawable.button__noclickable_shape);
mBtnDelete.setEnabled(false);
mBtnDelete.setTextColor(ContextCompat.getColor(this, R.color.color_b7b8bd));
}
}
至於全選和反選的操作,就是遍歷這個bean類,得到他的選擇狀態,重新設定就可以了.
if (radioAdapter == null) return;
if (!isSelectAll) {
for (int i = 0, j = radioAdapter.getMyLiveList().size(); i < j; i++) {
radioAdapter.getMyLiveList().get(i).setSelect(true);
}
index = radioAdapter.getMyLiveList().size();
mBtnDelete.setEnabled(true);
selectAll.setText("取消全選");
isSelectAll = true;
} else {
for (int i = 0, j = radioAdapter.getMyLiveList().size(); i < j; i++) {
radioAdapter.getMyLiveList().get(i).setSelect(false);
}
index = 0;
mBtnDelete.setEnabled(false);
selectAll.setText("全選");
isSelectAll = false;
}
radioAdapter.notifyDataSetChanged();
setBtnBackground(index);
tv_select_num.setText(String.valueOf(index));