先看图
点击第一条和第二条,后面的第24条和25条也被选上了。这个问题是recyclerview的item复用导致的。具体原因我正在看,解决办法如下。
首先,主页面的布局就只有一个recyclerview。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.wuyueshangshui.leftbutton.Popup5Activity">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_radio"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
下面先定义一个model来保存每一个item的信息。
public class CheckItem {
private String name;
private boolean isSelect;//是否被选择,这个是主要解决item错乱的因素。
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isSelect() {
return isSelect;
}
public void setSelect(boolean select) {
isSelect = select;
}
}
下面的是主activity的代码
public class Popup5Activity extends AppCompatActivity implements MyAdapter.OnSelectListener {
private List<Popup5Bean> datas=new ArrayList<>();
private MyAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_popup5);
RecyclerView recyclerView=findViewById(R.id.recycler_radio);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
//添加测试数据
for (int i = 0; i < 40; i++) {
Popup5Bean popup5Bean=new Popup5Bean("你好"+i,false);
datas.add(popup5Bean);
}
adapter = new MyAdapter(datas);
recyclerView.setAdapter(adapter);
//添加多选框的点击事件
adapter.setOnSelectListener(this);
}
@Override
public void SelectListener(int position) {
if (datas.get(position).isSelect()){
//如果当前是选中的,点击后置为false;
datas.get(position).setSelect(false);
}else{
//如果当前是没选中的,点击后置为true;
datas.get(position).setSelect(true);
}
//这个适配器的刷新不能丢。
adapter.notifyDataSetChanged();
}
}
下面是适配器的代码:
class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyHolder>{
List<Popup5Bean> dataList;
private OnSelectListener onSelectListener;
public MyAdapter(List<Popup5Bean> dataList) {
this.dataList = dataList;
}
@Override
public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item,null);
return new MyHolder(view);
}
@Override
public void onBindViewHolder(MyHolder holder, final int position) {
holder.textView.setText(dataList.get(position).getName());
//根据model中的isSelect标记来设置是否选中
if (dataList.get(position).isSelect()){
holder.checkBox.setChecked(true);
}else{
holder.checkBox.setChecked(false);
}
//点击checkbox的事件
holder.checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onSelectListener.SelectListener(position);
}
});
}
@Override
public int getItemCount() {
return dataList.size();
}
public interface OnSelectListener{
void SelectListener(int position);
}
public void setOnSelectListener(OnSelectListener onSelectListener){
this.onSelectListener=onSelectListener;
}
class MyHolder extends RecyclerView.ViewHolder{
TextView textView;
CheckBox checkBox;
public MyHolder(View itemView) {
super(itemView);
textView=itemView.findViewById(R.id.item_text);
checkBox=itemView.findViewById(R.id.item_checkbox);
}
}
}
适配器的布局代码是:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="40dp"
android:orientation="horizontal">
<ImageView
android:id="@+id/item_imageview"
android:layout_width="40dp"
android:layout_height="40dp"
android:scaleType="fitCenter"
android:src="@mipmap/ic_launcher"
/>
<CheckBox
android:id="@+id/item_checkbox"
android:layout_width="40dp"
android:layout_height="40dp" />
<TextView
android:id="@+id/item_text"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center_vertical|left"
android:textSize="20sp"
android:text="acbcd"
/>
</LinearLayout>
最后的运行效果是:
唯一的不足是没有了多选框的动画效果了。