带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>