带Checkbox的RecyclerView和ListView的复用

带Checkbox的RecyclerView和ListView的复用

Activity

package com.ahtelit.zbv.myapplication.TestBaseRV;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.ListView;

import com.ahtelit.zbv.myapplication.LVAdapter_Two;
import com.ahtelit.zbv.myapplication.LVItem;
import com.ahtelit.zbv.myapplication.R;

import java.util.ArrayList;
import java.util.List;

public class Main12Activity extends AppCompatActivity {

    RecyclerView rv;
    ListView lv;
    private ArrayList<LVItem> list;
    private int[] pics = new int[]{
            R.drawable.ic_ebook_color_check1, R.drawable.ic_ebook_color_check2, R.drawable.ic_ebook_color_check3,
            R.drawable.ic_ebook_color_check4, R.drawable.ic_ebook_color_check5, R.drawable.ic_ebook_color_check6,
            R.drawable.ic_ebook_color_check7, R.drawable.ic_ebook_color_check8, R.drawable.ic_ebook_color_check9,
            R.drawable.ic_ebook_color_check10
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main12);
//        rv = (RecyclerView) findViewById(R.id.rv);
//        rv.setLayoutManager(new LinearLayoutManager(this));
        list = new ArrayList<LVItem>();
        inflateDatas();
//        TestAdapter adapter = new TestAdapter(R.layout.item_img, list);
//        NormalAdapter adapter_normal=new NormalAdapter(this,list);
//        rv.setAdapter(adapter);

        lv=(ListView) findViewById(R.id.lv);
        LVAdapter_Two lvAdapter_two=new LVAdapter_Two(this,list);
        lv.setAdapter(lvAdapter_two);
    }

    int picIndex=-1;
    //填充数据---一次性填充十条数据
    private void inflateDatas() {
        for (int i = 0; i < 20; i++) {
            picIndex++;
            if(picIndex>9){
                picIndex=0;
            }
            LVItem item = new LVItem(pics[picIndex], "七子笑" + i, "2018/05/02", false);
            list.add(item);
        }
    }
}

RecyclerViewAdapter

package com.ahtelit.zbv.myapplication.TestBaseRV;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.TextView;

import com.ahtelit.zbv.myapplication.LVItem;
import com.ahtelit.zbv.myapplication.R;
import com.ahtelit.zbv.myapplication.RVAdapter;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Administrator on 2018/5/22.
 * qzx
 */

public class NormalAdapter extends RecyclerView.Adapter<NormalAdapter.TestViewHolder> {
    private List<LVItem> datas;
    private Context mContext;
    public NormalAdapter(Context context, ArrayList<LVItem> list){
        mContext=context;
        datas=list;
    }


    @Override
    public NormalAdapter.TestViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        Log.d("zbv","onCreateViewHolder");
        return new NormalAdapter.TestViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_img,parent,false));
    }


    @Override
    public void onBindViewHolder(final NormalAdapter.TestViewHolder holder, final int position) {

//        //复用设置
//        holder.setIsRecyclable(false);
        holder.iv.setImageResource(datas.get(position).getResId_img());
        holder.tv_time.setText(datas.get(position).getText());
        holder.tv_date.setText(datas.get(position).getDate());

        //同ListView分析相同
        holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                Log.d("zbv","isChecked="+isChecked+";position="+position);
                datas.get(position).setSelected(isChecked);
            }
        });

        holder.checkBox.setChecked(datas.get(position).isSelected());


        Log.d("zbv","isSelected="+datas.get(position).isSelected());

    }

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

    public static class TestViewHolder extends RecyclerView.ViewHolder{
        ImageView iv;
        TextView tv_time;
        TextView tv_date;
        CheckBox checkBox;

        public TestViewHolder(View itemView) {
            super(itemView);

            iv=(ImageView) itemView.findViewById(R.id.item_img);

            tv_time=(TextView) itemView.findViewById(R.id.item_tv_txt);

            tv_date=(TextView) itemView.findViewById(R.id.item_tv_date);

            checkBox=(CheckBox) itemView.findViewById(R.id.item_cb);


        }
    }
}

ListViewAdapter

在build.gradle中导入配置

compile 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.30'
package com.ahtelit.zbv.myapplication;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ImageView;
import android.widget.TextView;

public class LVAdapter_Two extends BaseAdapter {

    private List<LVItem> datas;
    private Context mContext;

    public LVAdapter_Two(Context context,ArrayList<LVItem> list){
        datas=list;
        mContext=context;
    }

    @Override
    public int getCount() {
        return datas.size();
    }

    @Override
    public Object getItem(int position) {
        return datas.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    private ViewHolder mViewHolder=null;
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {

        if(convertView==null){
            Log.d("zbv","convertView---》new");
            mViewHolder=new ViewHolder();
            //加载布局初始化item组件
            convertView=LayoutInflater.from(mContext).inflate(R.layout.item_img, parent,false);
            mViewHolder.iv_img=(ImageView) convertView.findViewById(R.id.item_img);
            mViewHolder.tv_txt=(TextView) convertView.findViewById(R.id.item_tv_txt);
            mViewHolder.tv_date=(TextView) convertView.findViewById(R.id.item_tv_date);
            mViewHolder.cb_sel=(CheckBox) convertView.findViewById(R.id.item_cb);
            convertView.setTag(mViewHolder);
        }else{
            Log.d("zbv","convertView---》reuse");
            mViewHolder=(ViewHolder) convertView.getTag();
        }
        Log.d("zbv","position="+position);

        //为item视图添加数据
        mViewHolder.iv_img.setImageResource(datas.get(position).getResId_img());
        mViewHolder.tv_txt.setText(datas.get(position).getText());
        mViewHolder.tv_date.setText(datas.get(position).getDate());

//        mViewHolder.cb_sel.setChecked(datas.get(position).isSelected());

        /*
        mViewHolder.cb_sel.setChecked(datas.get(position).isSelected());在监听器前面
        例如可见是7,当第一个被选中,到第八个复用第一个这时第八个是非选中状态,要触发checkedChange监听
        而此时clickPosition=0,就把第一个的选中状态给取消了,这是因为这个check的监听器还是第一个控件的监听器,
        当先执行setcheck时就会出现clickPosition=0
        mViewHolder.cb_sel.setChecked(datas.get(position).isSelected());在监听器后面
        第八个复用第一个控件时clickPosition=8,控件一的状态还是选中状态
         */
        mViewHolder.cb_sel.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                Log.d("zbv","click position="+position);
                datas.get(position).setSelected(isChecked);
//                datas.get(position).setSelected(isChecked);
                //这句代码有问题---因为当前的viewHolder
//                mViewHolder.cb_sel.setChecked(isChecked);
            }
        });

        mViewHolder.cb_sel.setChecked(datas.get(position).isSelected());

        Log.d("zbv","first state="+datas.get(position).isSelected());

        return convertView;
    }

    private static class ViewHolder{
        ImageView iv_img;
        TextView tv_txt;
        TextView tv_date;
        CheckBox cb_sel;
    }

}

使用BaseRecyclerViewAdapterHelper

package com.ahtelit.zbv.myapplication.TestBaseRV;

import android.support.annotation.Nullable;
import android.util.Log;
import android.widget.CheckBox;
import android.widget.CompoundButton;

import com.ahtelit.zbv.myapplication.LVItem;
import com.ahtelit.zbv.myapplication.R;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;

import java.util.List;

/**
 * Created by Administrator on 2018/5/22.
 * qzx
 */

public class TestAdapter extends BaseQuickAdapter<LVItem,BaseViewHolder> {
    public TestAdapter(int layoutResId, @Nullable List<LVItem> data) {
        super(layoutResId, data);
    }

    @Override
    protected void convert(BaseViewHolder helper, final LVItem item) {

        helper.setIsRecyclable(false);
        helper.setImageResource(R.id.item_img,item.getResId_img());
        helper.setText(R.id.item_tv_txt,item.getText());
        helper.setText(R.id.item_tv_date,item.getDate());
        final CheckBox checkBox=(CheckBox) helper.getView(R.id.item_cb);

        checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                item.setSelected(isChecked);
            }
        });

        checkBox.setChecked(item.isSelected());


    }
}

Item的Layout

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <ImageView 
        android:id="@+id/item_img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@mipmap/ic_launcher"
        />

    <TextView 
        android:layout_toRightOf="@+id/item_img"
        android:id="@+id/item_tv_txt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="七子笑"
        />

    <TextView 
        android:layout_toRightOf="@+id/item_img"
        android:layout_below="@+id/item_tv_txt"
        android:layout_alignBottom="@+id/item_img"
        android:gravity="bottom"
        android:id="@+id/item_tv_date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="2018/05/02"
        />

    <CheckBox 
        android:id="@+id/item_cb"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        />

</RelativeLayout>

最后相关代码下载:

核心代码下载地址

猜你喜欢

转载自blog.csdn.net/zb52588/article/details/80434418