Android Recyclerview實(shí)現(xiàn)多選,單選,全選,反選,批量刪除的功能
效果圖如下:

Recyclerview 實(shí)現(xiàn)多選,單選,全選,反選,批量刪除的步驟
1.在Recyclerview布局中添加上底部的全選和反選按鈕,刪除按鈕,和計(jì)算數(shù)量等控件
2.這里選中的控件沒(méi)有用checkbox來(lái)做,用的是imageview,選中和不選中其實(shí)是兩張圖片
3.默認(rèn)是不顯示選中的控件的,點(diǎn)擊編輯的時(shí)候顯示,點(diǎn)擊取消的時(shí)候隱藏
4.通過(guò)adapter和activity數(shù)據(jù)之間的傳遞,然后進(jìn)行具體的操作
具體代碼如下:
在recyclerview的布局中寫(xiě)全選,反選,刪除,計(jì)數(shù)等相應(yīng)的控件
<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中的布局就不必再寫(xiě)了,就一個(gè)item,最左邊一個(gè)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"/>
布局寫(xiě)完開(kāi)始寫(xiě)邏輯代碼
首先在adapter定義一個(gè)方法,以便在activity中拿到數(shù)據(jù)添加進(jìn)adapter中
public void notifyAdapter(List<MyLiveList.MyLive> myLiveList,boolean isAdd){
if (!isAdd){
this.mMyLiveList=myLiveList;
}else {
this.mMyLiveList.addAll(myLiveList);
}
notifyDataSetChanged();
}
然后在activity中拿到獲取到數(shù)據(jù)后調(diào)用adapter中的這個(gè)方法,添加數(shù)據(jù)
mAdapter.notifyAdapter(data.getList(), false);
在adapter中在判空,更有保證
public List<MyLiveList.MyLive> getMyLiveList(){
if (mMyLiveList == null) {
mMyLiveList =new ArrayList<>();
}
return mMyLiveList;
}
然后adapter中的getItemCount就直接拿到上面這個(gè)mMyLiveList的大小就可以了
接下來(lái)開(kāi)始點(diǎn)擊編輯的時(shí)候顯示出imageview和recycleview中的底部全選反選部分
定義兩個(gè)變量
private static final int MYLIVE_MODE_CHECK = 0;
private static final int MYLIVE_MODE_EDIT = 1;
//點(diǎn)擊編輯的時(shí)候顯示,順便調(diào)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);
//當(dāng)然,adapter中也有先關(guān)的變量在記錄
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); // 為了條目不復(fù)用
//顯示和隱藏
if (mEditMode == MYLIVE_MODE_CHECK) {
holder.mCheckBox.setVisibility(View.GONE);
} else {
holder.mCheckBox.setVisibility(View.VISIBLE);
為了方便記錄選中的狀態(tài),在bean里面用個(gè)變量記起來(lái)
public boolean isSelect;
public boolean isSelect() {
return isSelect;
}
public void setSelect(boolean isSelect) {
this.isSelect = isSelect;
}
//然后點(diǎn)擊條目選中和不選中的時(shí)候?yàn)镮mageview設(shè)置不同的圖片
if(myLive.isSelect()) {
holder.mCheckBox.setImageResource(R.mipmap.ic_checked);
}else{
holder.mCheckBox.setImageResource(R.mipmap.ic_uncheck);
}
//在adapter中暴漏一個(gè)Item的點(diǎn)擊事件的接口
public interface OnSwipeListener {
void onItemClickListener(int pos,List<MyLiveList.MyLive> myLiveList);
}
/*
在activity中的item點(diǎn)擊事件中,來(lái)操作Imageview是否選中
*/
//用一個(gè)變量記錄
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();
/**
* 根據(jù)選擇的數(shù)量是否為0來(lái)判斷按鈕的是否可點(diǎn)擊.
*
* @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));
}
}
至于全選和反選的操作,就是遍歷這個(gè)bean類(lèi),得到他的選擇狀態(tài),重新設(shè)置就可以了.
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));
最后刪除的話就調(diào)刪除的接口,遍歷這個(gè)bean,判斷當(dāng)前的狀態(tài)如果是選中的狀態(tài),就刪除! 這樣就OK了 !!!
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android實(shí)現(xiàn)彈出列表、單選、多選框
- Android ExpandableListView單選以及多選實(shí)現(xiàn)代碼
- Android ListView實(shí)現(xiàn)單選及多選等功能示例
- Android自定義單選多選下拉列表的實(shí)例代碼
- Android使用AlertDialog實(shí)現(xiàn)的信息列表單選、多選對(duì)話框功能
- Android中ListView + CheckBox實(shí)現(xiàn)單選、多選效果
- Android實(shí)現(xiàn)單選與多選對(duì)話框的代碼
- Android ListView構(gòu)建支持單選和多選的投票項(xiàng)目
- Android中創(chuàng)建對(duì)話框(確定取消對(duì)話框、單選對(duì)話框、多選對(duì)話框)實(shí)例代碼
- Android單選多選按鈕的使用方法
相關(guān)文章
Android開(kāi)發(fā)準(zhǔn)確獲取手機(jī)IP地址的兩種方式
這篇文章主要介紹了Android開(kāi)發(fā)準(zhǔn)確獲取手機(jī)IP地址的兩種方式,需要的朋友可以參考下2020-03-03
Qt6.5.3?Android環(huán)境配置的實(shí)現(xiàn)
本文主要介紹了Qt6.5.3?Android環(huán)境配置的實(shí)現(xiàn),文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-01-01
Kotlin擴(kuò)展函數(shù)與運(yùn)算符重載超詳細(xì)解析
Kotlin可以為一個(gè)不能修改的或來(lái)自第三方庫(kù)中的類(lèi)編寫(xiě)一個(gè)新的函數(shù)。這個(gè)新增的函數(shù)就像那個(gè)原始類(lèi)本來(lái)就有的函數(shù)一樣,可以用普通的方法調(diào)用,這種機(jī)制的函數(shù)稱為擴(kuò)展函數(shù)2022-11-11
Android開(kāi)發(fā)App啟動(dòng)流程與消息機(jī)制詳解
這篇文章主要為大家介紹了Android開(kāi)發(fā)App啟動(dòng)流程與消息機(jī)制詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
Android 8.0中一些坑以及對(duì)應(yīng)的解決方法
這篇文章主要給大家介紹了關(guān)于Android 8.0中一些坑以及對(duì)應(yīng)的解決方法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09
Android實(shí)現(xiàn)兩圓點(diǎn)之間來(lái)回移動(dòng)加載進(jìn)度
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)兩圓點(diǎn)之間來(lái)回移動(dòng)加載進(jìn)度,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06
Android開(kāi)發(fā)TextView內(nèi)的文字實(shí)現(xiàn)自動(dòng)換行
這篇文章主要為大家介紹了Android開(kāi)發(fā)TextView內(nèi)的文字實(shí)現(xiàn)自動(dòng)換行,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Android中實(shí)現(xiàn)滑動(dòng)的七種方式總結(jié)
這篇文章主要介紹了Android中實(shí)現(xiàn)滑動(dòng)的七種方式總結(jié),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-02-02

