Android Recyclerview复选框保持选中状态有问题吗?
已解决:我正在使用带有复选框的自定义recyclerview适配器,以便用户可以选择多个选中项 开始时,我在向下滚动时遇到重复的复选框选择,因此我添加了一个位置数组以保持复选框选择为真或假。现在重复的复选框选择问题消失,但在向下滚动时,选中的复选框被取消选择。我的recyclerview Adpeter如下所示Android Recyclerview复选框保持选中状态有问题吗?,android,kotlin,android-recyclerview,Android,Kotlin,Android Recyclerview,已解决:我正在使用带有复选框的自定义recyclerview适配器,以便用户可以选择多个选中项 开始时,我在向下滚动时遇到重复的复选框选择,因此我添加了一个位置数组以保持复选框选择为真或假。现在重复的复选框选择问题消失,但在向下滚动时,选中的复选框被取消选择。我的recyclerview Adpeter如下所示 class IngredientsAdapter(var context: Context?,var activity: Activity, var ingredientList:Arr
class IngredientsAdapter(var context: Context?,var activity: Activity, var ingredientList:ArrayList<String>, var imageID:Int):
RecyclerView.Adapter<IngredientsAdapter.IngredientViewHolder>() {
private var positionArray:ArrayList<Boolean> = ArrayList(ingredientList.size)
private val selectedList=ArrayList<String>()
init {
for (i in ingredientList.indices) {
positionArray.add(false)
}
}
override fun onCreateViewHolder(p0: ViewGroup, p1: Int): IngredientViewHolder {
val layoutInflater = LayoutInflater.from(p0.context)
return (IngredientsAdapter.IngredientViewHolder(layoutInflater.inflate(R.layout.ingredient_list_row,p0,false)))
}
override fun getItemCount(): Int {
return ingredientList.size
}
override fun onBindViewHolder(p0: IngredientViewHolder, p1: Int) {
p0.imageView.setImageResource(imageID)
p0.textView.text = ingredientList[p1]
//added for solution here
p0.checkBox.setOnCheckedChangeListener(null)
p0.checkBox.isChecked = positionArray[p1]
val sharedPreferences= SharedPreferenceHelper(context, SystemConstants.SHARED_PREFS_CHECKDATA)
val checked=sharedPreferences.getPrefsBooleanValue(ingredientList[p1])
p0.checkBox.isChecked = checked
p0.checkBox.setOnCheckedChangeListener(CompoundButton.OnCheckedChangeListener { buttonView, isChecked ->
if(isChecked){
positionArray[p1] = true
selectedList.add(ingredientList[p1])
ingredientList.get(p1)
sharedPreferences.addPrefsBooleanVal(ingredientList[p1],true)
Log.d("debug","selecteditem==>$selectedList")
}else{
positionArray[p1] = false
selectedList.remove(ingredientList[p1])
sharedPreferences.addPrefsBooleanVal(ingredientList[p1],false)
Log.d("debug","selecteditem==>$selectedList")
}
})
}
class IngredientViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var textView= itemView.txt_row!!
var imageView= itemView.image_view!!
var checkBox= itemView.chk_row!!
}
}
class IngredientsAdapter(变量上下文:上下文?、变量活动:活动、变量ingredientList:ArrayList、变量imageID:Int):
RecyclerView.Adapter(){
私有变量位置数组:ArrayList=ArrayList(ingredientList.size)
private val selectedList=ArrayList()
初始化{
对于(IngCreditList.index中的i){
positionArray.add(false)
}
}
重写CreateViewHolder(p0:ViewGroup,p1:Int):InCreditViewHolder{
val layoutInflater=layoutInflater.from(p0.context)
返回(IngredientsAdapter.IngredientViewHolder(布局更平坦、充气(R.layout.Component\u list\u row,p0,false)))
}
重写getItemCount():Int{
返回IngreditList.size
}
覆盖BindViewHolder(p0:IngCreditViewHolder,p1:Int){
p0.imageView.setImageResource(imageID)
p0.textView.text=IngCreditList[p1]
//这里添加了解决方案
p0.checkBox.setOnCheckedChangeListener(空)
p0.checkBox.isChecked=positionArray[p1]
val sharedPreferences=SharedPreferenceHelper(上下文,SystemConstants.SHARED\u PREFS\u CHECKDATA)
val checked=SharedReferences.getPrefsBooleanValue(IngreditList[p1])
p0.checkBox.isChecked=checked
p0.checkBox.setOnCheckedChangeListener(CompoundButton.OnCheckedChangeListener{buttonView,isChecked->
如果(已检查){
positionArray[p1]=真
selectedList.add(ingredientList[p1])
IngreditList.get(p1)
SharedReferences.addPrefsBooleanVal(IngreditList[p1],true)
Log.d(“调试”,“selecteditem==>$selectedList”)
}否则{
positionArray[p1]=假
selectedList.remove(ingredientList[p1])
SharedReferences.addPrefsBooleanVal(IngreditList[p1],false)
Log.d(“调试”,“selecteditem==>$selectedList”)
}
})
}
类InCreditViewHolder(itemView:View):RecyclerView.ViewHolder(itemView){
var textView=itemView.txt\u行!!
var imageView=itemView.image\u view!!
var checkBox=itemView.chk_行!!
}
}
欢迎您提出任何建议。您可以使用模型类跟踪每个recyclerView项的复选框。使用setTag和getTag跟踪复选框状态 制作模型
public class Model {
private boolean isSelected;
private String animal;
public String getAnimal() {
return animal;
}
public void setAnimal(String animal) {
this.animal = animal;
}
public boolean getSelected() {
return isSelected;
}
public void setSelected(boolean selected) {
isSelected = selected;
}
}
创建integer.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<integer name="btnplusview">1</integer>
<integer name="btnpluspos">2</integer>
</resources>
1.
2.
最后,适配器如下所示:
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
public class CustomAdapter extends
RecyclerView.Adapter<CustomAdapter.MyViewHolder> {
private LayoutInflater inflater;
public static ArrayList<Model> imageModelArrayList;
private Context ctx;
public CustomAdapter(Context ctx, ArrayList<Model> imageModelArrayList) {
inflater = LayoutInflater.from(ctx);
this.imageModelArrayList = imageModelArrayList;
this.ctx = ctx;
}
@Override
public CustomAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int
viewType) {
View view = inflater.inflate(R.layout.rv_item, parent, false);
MyViewHolder holder = new MyViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(final CustomAdapter.MyViewHolder holder, int
position) {
holder.checkBox.setText("Checkbox " + position);
holder.checkBox.setChecked(imageModelArrayList.get(position).getSelected());
holder.tvAnimal.setText(imageModelArrayList.get(position).getAnimal());
// holder.checkBox.setTag(R.integer.btnplusview, convertView);
holder.checkBox.setTag(position);
holder.checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Integer pos = (Integer) holder.checkBox.getTag();
Toast.makeText(ctx, imageModelArrayList.get(pos).getAnimal() + "
clicked!", Toast.LENGTH_SHORT).show();
if (imageModelArrayList.get(pos).getSelected()) {
imageModelArrayList.get(pos).setSelected(false);
} else {
imageModelArrayList.get(pos).setSelected(true);
}
}
});
}
@Override
public int getItemCount() {
return imageModelArrayList.size();
}
class MyViewHolder extends RecyclerView.ViewHolder {
protected CheckBox checkBox;
private TextView tvAnimal;
public MyViewHolder(View itemView) {
super(itemView);
checkBox = (CheckBox) itemView.findViewById(R.id.cb);
tvAnimal = (TextView) itemView.findViewById(R.id.animal);
}
}
}
导入android.content.Context;
导入android.support.v7.widget.RecyclerView;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.CheckBox;
导入android.widget.TextView;
导入android.widget.Toast;
导入java.util.ArrayList;
公共类CustomAdapter扩展
RecyclerView.适配器{
私人充气机;
公共静态ArrayList imageModelArrayList;
私有上下文ctx;
公共CustomAdapter(上下文ctx、ArrayList imageModelArrayList){
充气机=从(ctx)开始的充气机;
this.imageModelArrayList=imageModelArrayList;
this.ctx=ctx;
}
@凌驾
public CustomAdapter.MyViewHolder onCreateViewHolder(视图组父级,int
视图类型){
视图=充气机。充气(R.layout.rv_项目,父项,false);
MyViewHolder=新的MyViewHolder(视图);
报税表持有人;
}
@凌驾
公共无效onBindViewHolder(最终CustomAdapter.MyViewHolder,int
(职位){
holder.checkBox.setText(“复选框”+位置);
holder.checkBox.setChecked(imageModelArrayList.get(position.getSelected());
holder.tvAnimal.setText(imageModelArrayList.get(position.getAnimal());
//holder.checkBox.setTag(R.integer.btnplusview,convertView);
holder.checkBox.setTag(位置);
holder.checkBox.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
整数pos=(整数)holder.checkBox.getTag();
Toast.makeText(ctx,imageModelArrayList.get(pos.getAnimal()+)
单击!”,Toast.LENGTH\u SHORT.show();
if(imageModelArrayList.get(pos.getSelected()){
imageModelArrayList.get(位置).setSelected(错误);
}否则{
imageModelArrayList.get(位置).setSelected(真);
}
}
});
}
@凌驾
public int getItemCount(){
返回imageModelArrayList.size();
}
类MyViewHolder扩展了RecyclerView.ViewHolder{
受保护复选框;
私有文本视图;
公共MyViewHolder(查看项目视图){
超级(项目视图);
复选框=(复选框)itemView.findViewById(R.id.cb);
tvAnimal=(TextView)itemView.findViewById(R.id.animal);
}
}
}
当您调用setOnCheckedChangeListener
时,复选框有一个监听器,当您滚动时,recyclerview将多路显示。
然后应用p0.checkBox.isChecked=positionArray[p1]
,实际上更改了最后一个positon例如,选中第一个复选框,
arrray[0]
为true,然后滚动视图,下一项可能是第四个或第五个复选框引用相同。然后再次调用
p0.checkBox.isChecked=positionArray[p1]
,但侦听器属于第一项。然后侦听器将更改数组[0]因此,您应该在
p0.checkBox.isChecked=positionArray[p1]
之前调用p0.checkBox.setOnCheckedChangeListener
。您将需要使用OnClickListener。你的评论也没有错,只是
switch.setOnCheckedChangeListener(null) // remove any existing listener from recycled view
switch.isChecked = [true/false] // will no longer trigger any callback to listener
switch.setOnCheckedChangeListener { btnView, isChecked ->
// do exiting stuff
}