RecyclerView的複用導致的多選混亂
阿新 • • 發佈:2019-02-09
先看圖
點選第一條和第二條,後面的第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>
最後的執行效果是:
唯一的不足是沒有了多選框的動畫效果了。