RecyclerView+ImageView實現(xiàn)單選咽筋、多選、全選徊件、取消效果

在之前的項目開發(fā)中就碰到過列表的單選奸攻、多選、全選虱痕、取消的效果睹耐,那個時候的實現(xiàn)方式是采用Listview+RaidonButton或者ListView+CheckBox的方式實現(xiàn),不過感覺采用Listview+RaidonButton或者ListView+CheckBox的方式實現(xiàn)效果并不是很好部翘,要處理Listview的條目點擊和CheckBox或者RaidonButton點擊的沖突疏橄,同時還要關(guān)聯(lián)條目點擊和CheckBox或者RaidonButton選擇的聯(lián)動,所有最近換RecyclerView+ImageView方式將效果又寫了下略就,RecyclerView+ImageView的方式就不需要去處理點擊沖突和聯(lián)動這些問題捎迫。

RecyclerView+ImageView實現(xiàn)單選
代碼如下:

public class SingleActivity extends AppCompatActivity {
    private RecyclerView recyclerview;
    private List<Datainfo> datas = new ArrayList<>();

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_single);
        getData();
        recyclerview = (RecyclerView) findViewById(R.id.recyclerview);
        //設(shè)置布局管理器
        recyclerview.setLayoutManager(new LinearLayoutManager(this));
        SingleAdater adapter = new SingleAdater(this, datas);
        //設(shè)置適配器
        recyclerview.setAdapter(adapter);
    }

    class SingleAdater extends RecyclerView.Adapter<SingleAdater.SingleHolder> {
        private List<Datainfo> mData;
        private Context mContext;
        private LayoutInflater mInflater;

        public SingleAdater(Context context, List<Datainfo> list) {
            this.mContext = context;
            mInflater = LayoutInflater.from(mContext);
            this.mData = new ArrayList<>();
            if (mData != null) {
                this.mData.addAll(list);
            }
        }

        /**
         * 刷新數(shù)據(jù)
         *
         * @param list
         */
        public void nodfiyData(List<Datainfo> list) {
            if (list != null) {
                this.mData.clear();
                this.mData.addAll(list);
            }
            notifyDataSetChanged();
        }

        @Override
        public SingleHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = mInflater.inflate(R.layout.single_item, parent, false);
            SingleHolder holder = new SingleHolder(view);
            return holder;
        }

        @Override
        public void onBindViewHolder(final SingleHolder holder, int position) {
            final Datainfo datainfo = mData.get(position);
            holder.tvItem.setText(datainfo.itemContent);
            final boolean isCheck = datainfo.isCheck;
            if (isCheck) {
                //被選
                holder.ivCheck.setImageResource(R.drawable.image_check);
            } else {
                //未被選
                holder.ivCheck.setImageResource(R.drawable.image_uncheck);
            }
            holder.llLayout.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    String newId = datainfo.itemId;
                    for (Datainfo datainfo1 : datas) {
                        String oldId = datainfo1.itemId;
                        if (newId.equals(oldId)) {
                            datainfo1.isCheck = true;
                        }else{
                            datainfo1.isCheck = false;
                        }
                    }
                    //刷新數(shù)據(jù)
                    nodfiyData(datas);
                }
            });
        }

        @Override
        public int getItemCount() {
            return mData.size();
        }

        class SingleHolder extends RecyclerView.ViewHolder {
            ImageView ivCheck;
            TextView tvItem;
            LinearLayout llLayout;

            public SingleHolder(View itemView) {
                super(itemView);
                ivCheck = (ImageView) itemView.findViewById(R.id.iv_check);
                tvItem = (TextView) itemView.findViewById(R.id.tv_item);
                llLayout = (LinearLayout) itemView.findViewById(R.id.ll_layout);
            }
        }
    }

    private void getData() {
        for (int i = 0; i < 40; i++) {
            Datainfo info = new Datainfo();
            info.isCheck = false;
            info.itemContent = "item" + i;
            info.itemId = "" + i;
            datas.add(info);
        }
    }
}
GIF.gif

并沒有影響條目點擊事件,同時列表數(shù)據(jù)并沒有出現(xiàn)錯亂表牢;因為RecyclerView本身是沒有條目點擊事件的窄绒,所以這里并不需給RecyclerView設(shè)置條目點擊,直接給item條目設(shè)置點擊事件崔兴,在對點擊時處理imageview的背景要好處理寫彰导。

RecyclerView+ImageView實現(xiàn)多選蛔翅、全選、取消效果
代碼如下:

public class MoreActivity extends AppCompatActivity{
    private RecyclerView recyclerview;
    private List<Datainfo> datas = new ArrayList<>();
    private MoreAdpter adapter;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_more);
        getData();
        recyclerview = (RecyclerView) findViewById(R.id.recyclerview);
        //設(shè)置布局管理器
        recyclerview.setLayoutManager(new LinearLayoutManager(this));
        //設(shè)置adapter
        adapter =new MoreAdpter(this,datas);
        recyclerview.setAdapter(adapter);
    }

    /**
     * 全選
     * @param view
     */
    public void btnAll(View view){
        setData(true);
    }

    /**
     * 取消
     * @param view
     */
    public void btnCanl(View view){
        setData(false);
    }
    /**
     * 根據(jù)全選或取消設(shè)置數(shù)據(jù)
     * @param isAll  是否全選
     */
    private void setData(boolean isAll){
        for (Datainfo data : datas) {
            if(isAll){
                data.isCheck=true;
            }else{
                data.isCheck=false;
            }
        }
        //刷新數(shù)據(jù)
        adapter.nodfiyData(datas);
    }
    class MoreAdpter extends RecyclerView.Adapter<MoreAdpter.MoreHolder>{
        private List<Datainfo> mData;
        private Context mContext;
        private LayoutInflater mInflater;
        public MoreAdpter(Context context, List<Datainfo> list) {
            this.mContext = context;
            mInflater = LayoutInflater.from(mContext);
            this.mData = new ArrayList<>();
            if (mData != null) {
                this.mData.addAll(list);
            }
        }

        /**
         * 刷新數(shù)據(jù)
         *
         * @param list
         */
        public void nodfiyData(List<Datainfo> list) {
            if (list != null) {
                this.mData.clear();
                this.mData.addAll(list);
            }
            notifyDataSetChanged();
        }
        @Override
        public MoreHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = mInflater.inflate(R.layout.single_item, parent, false);
            MoreHolder holder = new MoreHolder(view);
            return holder;
        }

        @Override
        public void onBindViewHolder(MoreHolder holder, int position) {
            final Datainfo datainfo = mData.get(position);
            holder.tvItem.setText(datainfo.itemContent);
            final boolean isCheck = datainfo.isCheck;
            if (isCheck) {
                //被選
                holder.ivCheck.setImageResource(R.drawable.image_check);
            } else {
                //未被選
                holder.ivCheck.setImageResource(R.drawable.image_uncheck);
            }
            holder.llLayout.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    String newId = datainfo.itemId;
                    for (Datainfo datainfo1 : datas) {
                        String oldId = datainfo1.itemId;
                        if (newId.equals(oldId)) {
                            boolean isCheck1 = datainfo1.isCheck;
                            if(isCheck1){
                                datainfo1.isCheck=false;
                            }else{
                                datainfo1.isCheck=true;
                            }
                            break;
                        }
                    }
                    //刷新數(shù)據(jù)
                    nodfiyData(datas);
                }
            });
        }

        @Override
        public int getItemCount() {
            return mData.size();
        }

        class MoreHolder extends RecyclerView.ViewHolder{
            ImageView ivCheck;
            TextView tvItem;
            LinearLayout llLayout;
            public MoreHolder(View itemView) {
                super(itemView);
                ivCheck = (ImageView) itemView.findViewById(R.id.iv_check);
                tvItem = (TextView) itemView.findViewById(R.id.tv_item);
                llLayout = (LinearLayout) itemView.findViewById(R.id.ll_layout);
            }
        }
    }
    private void getData() {
        for (int i = 0; i < 40; i++) {
            Datainfo info = new Datainfo();
            info.isCheck = false;
            info.itemContent = "item" + i;
            info.itemId = "" + i;
            datas.add(info);
        }
    }
}

GIF.gif

同樣不影響條目點擊位谋,列表數(shù)據(jù)也沒有出現(xiàn)錯亂山析。

源碼地址:
http://pan.baidu.com/s/1eR819ei

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市掏父,隨后出現(xiàn)的幾起案子笋轨,更是在濱河造成了極大的恐慌,老刑警劉巖赊淑,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爵政,死亡現(xiàn)場離奇詭異,居然都是意外死亡陶缺,警方通過查閱死者的電腦和手機钾挟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來饱岸,“玉大人掺出,你說我怎么就攤上這事∩环眩” “怎么了汤锨?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長黍衙。 經(jīng)常有香客問我,道長荠诬,這世上最難降的妖魔是什么琅翻? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮柑贞,結(jié)果婚禮上方椎,老公的妹妹穿的比我還像新娘。我一直安慰自己钧嘶,他們只是感情好棠众,可當(dāng)我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著有决,像睡著了一般闸拿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上书幕,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天新荤,我揣著相機與錄音,去河邊找鬼台汇。 笑死苛骨,一個胖子當(dāng)著我的面吹牛篱瞎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播痒芝,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼俐筋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了严衬?” 一聲冷哼從身側(cè)響起澄者,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瞳步,沒想到半個月后闷哆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡单起,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年抱怔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嘀倒。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡屈留,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出测蘑,到底是詐尸還是另有隱情灌危,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布碳胳,位于F島的核電站勇蝙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏挨约。R本人自食惡果不足惜味混,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诫惭。 院中可真熱鬧翁锡,春花似錦、人聲如沸夕土。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怨绣。三九已至角溃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間篮撑,已是汗流浹背开镣。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留咽扇,地道東北人邪财。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓陕壹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親树埠。 傳聞我的和親對象是個殘疾皇子糠馆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,290評論 25 707
  • 我聽過绊袋,就像野獸的哀嚎一樣恐怖毕匀! 就在前幾天的廈門,我和一個與我一樣充滿好奇心的女生一起看過癌别,晚上9點多了皂岔,我和她...
    李冬莉閱讀 730評論 5 1
  • “春天又來了呀≌菇悖”清晨走在去教室的路上躁垛,西西對身旁仍舊睡眼惺忪的小賴說。 都說心底善良的女孩子總是會有...
    王瘋瘋閱讀 476評論 0 1
  • 像是一場霧里的揮手作別圾笨,是模糊的惆悵教馆。八月末,九月初擂达,大概是合歡花落盡的季節(jié)土铺,傳統(tǒng)意義上闔家團(tuán)圓的那天將近,...
    郁洲閱讀 532評論 0 5
  • 下面是我個人在做行動計劃時的一些方法,希望可以幫到你 1穗熬、分析當(dāng)前生活模式镀迂。 以7天為一個時間周期丁溅,記錄并總結(jié)近期...
    磐玉2閱讀 1,265評論 0 50