1. 程式人生 > >關於Recyclerview 實現多選,單選,全選,反選,批量刪除的功能的實現

關於Recyclerview 實現多選,單選,全選,反選,批量刪除的功能的實現

效果圖如下:

這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

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));

最後刪除的話就調刪除的介面,遍歷這個bean,判斷當前的狀態如果是選中的狀態,就刪除! 這樣就OK了 !!!

郭昊個人部落格:

相關推薦

利用js實現功能(check)

box tag 實現 所有 利用 .get 乒乓球 獲取 get <!DOCTYPE html><html><head><meta charset="utf-8"/><title></ti

Android ListView長按彈出CheckBox,實現批量刪除功能

ListView長按彈出CheckBox,實現全選,反選,批量刪除功能. 主佈局:activity_main <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="

JQuery 迴圈遍歷 , 複checked屬性

陣列 集合的遍歷  $.each(list,function(index,item){ this. //this就表示item}); jquery物件的迴圈遍歷  jquery物件.each(function(){ this.  //this就表示迴圈的jquery物件})

shiro+cas+spring-data-redis實現系統點登入和分散式專案的session同步

CSDN開通很久了,但是一直沒寫東西,2018年了,這是我CSDN的第一篇文章,歡迎各位評論探討和指點。   一、背景: 現在公司的業務系統要做多臺分散式叢集,由於是web專案,要做session同步,想到的方案是用目前火熱的redis資料庫儲存session,還有業

自定義ViewGroup實現頁面上下滑動效果

閱讀過自定義ViewGroup實現仿淘寶的商品詳情頁的童鞋,應該都瞭解了ViewGroup中onMeasure、onLayout、onTouchEvent等相關方法的使用。在介紹仿淘寶商品詳情頁時,我們提到過現在網上很多實現方法是使用ScrollView巢狀兩個

jQuery實現form表序列化轉換為json對象功能示例

bubuko ret FN RR inpu info images serialize orm <!DOCTYPE html> <html> <head> <meta charset="utf-8" />

curl實現路並發請求(請求數量大時再次分割實現循環處理)

ret move data || timeout hand foreach 初始 nsf function multiple_threads_request($data,$url,$chuck_num=20,$wait_usec = 0){ $result = [

內部類實現繼承(內部類的優勢)及內部類實現一個介面與外圍類實現這個介面的區別

在java中一個類可以多重實現,但不能多重繼承,也就是說一個類能夠同時實現多個介面,但不能同時繼承多個類。但有時候我們確實需要繼承多個類,比如希望擁有兩個類的行為功能,就很難使用單繼承來解決問題了(當然多層繼承是可以解決的),那麼我們還可以用什麼辦法來解決多重繼承的問題呢?沒

java實現執行緒的兩種方式繼承Thread類和實現Runnable介面

 * 實現方式和繼承方式有什麼區別呢?  *         區別:  *                 繼承Thread:執行緒程式碼存放在Thread子類run方法中  *                 實現Runnable:執行緒程式碼存放在介面的子類的run方法

實現個具有相同方法的介面和父類與實現介面有相同方法

一、實現多個具有相同方法的介面 這種情況還是比較少會遇到的,但事實是存在這樣的問題,所以寫下解決的方法: 使用內部類: interface InterA {void f();}interface I

thinkphp批量刪除實現

name orm ras fun 但是 cte div 提交 否則 今天自己在寫後臺的時候需要把以前上傳的測試文章全部刪除掉,但是利用 【操作】裏面的一個個刪除比較慢,因此想出一個批量刪除的解決方案。 首先在前端頁面裏面建立一個表單,這個表單是把你選中的單選按鈕提交到控制器

利用協處理器endpoint實現批量刪除功能

最近因為工作需要,用到了hbase的協處理器endpoint,遇到了一些坑。以批量刪除功能為例記錄一些endpoint的使用方法。至於hbase只是以及協處理器coprocessor的知識在此不做過多介紹。 1.安裝protocbuf直譯器安裝 下載protobuf-2.5.0.ta

SSH註解框架實現批量刪除功能

一、UserDao.java /** * 批量刪除使用者 * @param ids 使用者Id陣列 * @return */ boolean delUserForBatch(Int

table control的修改/排序/刪除功能實現例項

本例項仿照SAP DEMO而寫 DEMO名稱是:demo_dynpro_tabcont_loop_at,自動動手寫一次的目的是把將該程式的註釋寫明白一點,希望本文對剛入門的博友在理解table control有一點幫助,依然很噁心這編輯器不能很方便的插入圖片。 主程式

Android EditText一鍵刪除功能實現

今天做了一個EditText帶刪除按鈕Demo感覺有點用,所以分享一下! 效果圖片 實現 1.在EditText上面加一個圖片 (1)新增圖片就比較簡單了在EditText裡面設定屬性 androi

Minifilter過濾,功能實現對驅動目錄的監控,包括建立,重新命名,刪除實現hips

注意下:我的這套過濾只能用在nt6系統上 原因是使用一個nt6上才有的函式 見函式 PsGetProcessFullName 其實沒必要自己來寫獲取全路徑 因為minifilter已經給我們提供了獲取全路徑的函式 FltGetFileNameInformation 我就不改

jsp批量刪除實現

最近在做一個小型的專案,剛好遇到了這個批量刪除的操作,因為用的是ssh框架,所以感覺實現起來也不難,分享出來給大家看看,大家有什麼寶貴的意見可以回覆我。 在做這個功能之前,我覺得要好好想想怎麼去實現,因為分析問題其實挺重要的,有的時候,一個不簡單也不復雜的問題可

sqlserver資料庫某表定期刪除功能實現

 新建資料庫BackDel,建立表Test(id,tm,v),型別隨意。先建立任務每5分鐘插入一條資料,再建立刪除任務。 sqlserver 啟動代理服務,開啟管理其介面,新建作業,常規裡面輸入名稱,選擇類別,輸入說明 轉到步驟中,設定執行什麼任務,新建步驟,步驟常規

vue+element的表格實現批量刪除功能

最近寫了一個批量刪除功能,遇到了不少坑,特此記錄一下 表格的程式碼如下 <el-table @row-click="handleCurrentChange" @selection-change="selsChange" ref="table"

Spring框架開發實現對商品列表的增刪改查以及批量刪除批量修改

花了一週時間重新熟悉了一下SSM三大框架,也經歷了一次由複雜及簡單的過程,從剛開始的使用Mybatis操作資料就可以比較其和JDBC的不同,相應的java程式碼減少了,但是相對的配置檔案的內容越來越多,程式碼以後的維護性也得到了越來越高的提升。後面使用SpringMVC後,