Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Recyclerview复选框保持选中状态有问题吗?_Android_Kotlin_Android Recyclerview - Fatal编程技术网

Android Recyclerview复选框保持选中状态有问题吗?

Android Recyclerview复选框保持选中状态有问题吗?,android,kotlin,android-recyclerview,Android,Kotlin,Android Recyclerview,已解决:我正在使用带有复选框的自定义recyclerview适配器,以便用户可以选择多个选中项 开始时,我在向下滚动时遇到重复的复选框选择,因此我添加了一个位置数组以保持复选框选择为真或假。现在重复的复选框选择问题消失,但在向下滚动时,选中的复选框被取消选择。我的recyclerview Adpeter如下所示 class IngredientsAdapter(var context: Context?,var activity: Activity, var ingredientList:Arr

已解决:我正在使用带有复选框的自定义recyclerview适配器,以便用户可以选择多个选中项

开始时,我在向下滚动时遇到重复的复选框选择,因此我添加了一个位置数组以保持复选框选择为真或假。现在重复的复选框选择问题消失,但在向下滚动时,选中的复选框被取消选择。我的recyclerview Adpeter如下所示

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项的复选框。使用setTaggetTag跟踪复选框状态

制作模型

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
   }