java - RecyclerView 中的复选框损坏
问题描述
我目前正在学习 Android Studio Java 编码,但遇到了麻烦。我使用 cardView 创建了 Recyclerview 并将复选框添加到 cardView。如果我创建新对象并选中它的复选框,它工作正常,删除线paintflag 工作。但是如果我添加另一个对象,它在第一个下面,我无法检查第一个对象,它不会改变它的paintflag。它工作的唯一方法是检查最后添加的对象,它可能对上面的所有 cardView 对象起作用(有时如果我取消选中上面的项目,删除线paintflag 不会删除)。
这是我的 CustomAdapter 代码:
import android.content.Context;
import android.graphics.Paint;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.lang.reflect.Array;
import java.util.ArrayList;
public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.MyViewHolder> {
private Context context;
private ArrayList book_id, book_title, book_author, book_pages;
CheckBox checkBox;
CustomAdapter(Context context,
ArrayList book_id,
ArrayList book_title,
ArrayList book_author,
ArrayList book_pages){
this.context = context;
this.book_id = book_id;
this.book_title = book_title;
this.book_author = book_author;
this.book_pages = book_pages;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
View view = inflater.inflate(R.layout.my_row, parent, false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
holder.book_id_txt.setText(String.valueOf(book_id.get(position)));
holder.book_title_txt.setText(String.valueOf(book_title.get(position)));
holder.book_author_txt.setText(String.valueOf(book_author.get(position)));
holder.book_pages_txt.setText(String.valueOf(book_pages.get(position)));
}
@Override
public int getItemCount() {
return book_id.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder {
TextView book_id_txt, book_title_txt, book_author_txt, book_pages_txt;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
book_id_txt = itemView.findViewById(R.id.book_id_txt);
book_title_txt = itemView.findViewById(R.id.book_title_txt);
book_author_txt = itemView.findViewById(R.id.book_author_txt);
book_pages_txt = itemView.findViewById(R.id.book_pages_txt);
checkBox = itemView.findViewById(R.id.checkBox);
checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (checkBox.isChecked()){
book_author_txt.setPaintFlags(book_author_txt.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
book_id_txt.setPaintFlags(book_id_txt.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
book_pages_txt.setPaintFlags(book_pages_txt.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
book_title_txt.setPaintFlags(book_title_txt.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
} else {
book_author_txt.setPaintFlags(book_author_txt.getPaintFlags() & (~ Paint.STRIKE_THRU_TEXT_FLAG));
book_id_txt.setPaintFlags(book_id_txt.getPaintFlags() & (~ Paint.STRIKE_THRU_TEXT_FLAG));
book_pages_txt.setPaintFlags(book_pages_txt.getPaintFlags() & (~ Paint.STRIKE_THRU_TEXT_FLAG));
book_title_txt.setPaintFlags(book_title_txt.getPaintFlags() & (~ Paint.STRIKE_THRU_TEXT_FLAG));
}
}
});
}
}
}
如果你还需要什么,可以问我。我是初学者,所以可能是假的)请帮助我
解决方案
要防止 RecyclerView 被回收,请先将此行添加到您的 CustomAdapter:
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
return position;
}
同样在您onBindViewHolder
尝试设置您的复选框默认状态时,例如:
if(condition){
holder.checkBox.setChecked(true);
}
else {
holder.checkBox.setChecked(false);
}
或者如果它只是未选中的默认值:
holder.checkBox.setChecked(false);
推荐阅读
- jquery - 我在用我的 html 代码制作带有嵌套类的 JSON 时遇到问题
- sql-server - 我有一个包含 1500 个左右表的 SQL Server 数据库。是否有一种快速方法可以在一个查询中确定每个表中每一列的最大值?
- asp.net-mvc - 无法从子 web.config 读取
- c# - Winforms 中的简单相机捕捉
- uart - **STM32f427 UART with DMA** 从控制台接收数据时最高位有时为1
- arrays - 如何在javascript变量中捕获多个嵌套的文档数组作为mongodb查询的结果
- autohotkey - 如何删除点 (.) 之前的文本
- angular - ng serve --prod 不包含来自组件的 css
- scala - Spark将覆盖插入动态分区表未按预期工作
- python - 我做错了什么?Django 对象过滤器