在 RecyclerView 中切换按钮位置

Toggle Button positions in RecyclerView

我在回收器视图中有切换按钮我将布尔值保存在 sharedpreference 中以识别每次重新启动应用程序时是否按下切换按钮现在的问题是 当我单击 1 切换按钮并关闭应用程序时,每个切换按钮都对关闭按钮进行相同的操作,切换按钮和回收器视图之间没有位置连接,这是我的代码

 @Override
public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.model,null);

    MyHolder holder=new MyHolder(v);
    SharedPreferences sharedPrefs = c.getSharedPreferences("lol", MODE_PRIVATE);
    Boolean a = sharedPrefs.getBoolean("abc" , false);
    if(a) {
        holder.fav.setBackgroundDrawable(ContextCompat.getDrawable(c, R.drawable.star_light));
        holder.fav.setChecked(true);
    } else {
        holder.fav.setBackgroundDrawable(ContextCompat.getDrawable(c, R.drawable.star_off));
        holder.fav.setChecked(false);
    }
    return holder;
}

@Override
public void onBindViewHolder(final MyHolder holder, final int position) {
    holder.nameTxt.setText(players[position]);
    holder.posTxt.setText(positions[position]);
    holder.img.setImageResource(images[position]);
    holder.fav.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if(isChecked) {
               holder.fav.setBackgroundDrawable(ContextCompat.getDrawable(c,R.drawable.star_light));
            SharedPreferences.Editor editor = c.getSharedPreferences("lol", MODE_PRIVATE).edit();
            editor.putBoolean("abc", true);
            editor.commit();
            } else {
                holder.fav.setBackgroundDrawable(ContextCompat.getDrawable(c, R.drawable.star_off));
                SharedPreferences.Editor editor = c.getSharedPreferences("lol", MODE_PRIVATE).edit();
                editor.putBoolean("abc", false);
                editor.commit();
            }
        }
    });

你的实现是错误的。

您应该只使用 onCreateViewHolder() 来扩充布局。

绑定操作应该在onBindViewHolder()中。在 onBindViewHolder()

中使用切换操作

我进行了快速编辑。请详细检查。我在 SharedPreferences 中使用了 position。所以每个 toggle button 值保存在不同的键中。这可能有效。

SharedPreferences.Editor editor = c.getSharedPreferences("lol", MODE_PRIVATE).edit();

@Override
public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.model,null);

    MyHolder holder=new MyHolder(v);

    return holder;
}


@Override
public void onBindViewHolder(final MyHolder holder, final int position) {


    holder.nameTxt.setText(players[position]);
    holder.posTxt.setText(positions[position]);
    holder.img.setImageResource(images[position]);

    SharedPreferences sharedPrefs = c.getSharedPreferences("lol", MODE_PRIVATE);
        Boolean a = sharedPrefs.getBoolean("abc"+position , false);
        if (a){
            holder.fav.setBackgroundDrawable(ContextCompat.getDrawable(c, R.drawable.star_light));
            holder.fav.setChecked(true);

        }else {
            holder.fav.setBackgroundDrawable(ContextCompat.getDrawable(c, R.drawable.star_off));
            holder.fav.setChecked(false);

        }

    holder.fav.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

            if (isChecked){
                holder.fav.setBackgroundDrawable(ContextCompat.getDrawable(c,R.drawable.star_light));

            editor.putBoolean("abc"+position, true);
            editor.commit();
            }
            else{
                holder.fav.setBackgroundDrawable(ContextCompat.getDrawable(c, R.drawable.star_off));

                editor.putBoolean("abc"+position, false);
                editor.commit();

            }
        }
    });

成功了谢谢大家这是正确答案

 @Override
public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.model,null);

    MyHolder holder=new MyHolder(v);

    return holder;
}


@Override
public void onBindViewHolder(final MyHolder holder, final int position) {


    holder.nameTxt.setText(players[position]);
    holder.posTxt.setText(positions[position]);
    holder.img.setImageResource(images[position]);
    SharedPreferences sharedPrefs = c.getSharedPreferences("lol", MODE_PRIVATE);
    Boolean a = sharedPrefs.getBoolean("abc" + position, false);
    if (a){
        holder.fav.setBackgroundDrawable(ContextCompat.getDrawable(c, R.drawable.star_light));
        holder.fav.setChecked(true);

    }else {
        holder.fav.setBackgroundDrawable(ContextCompat.getDrawable(c, R.drawable.star_off));
        holder.fav.setChecked(false);

    }


    holder.fav.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

            if (isChecked){
                holder.fav.setBackgroundDrawable(ContextCompat.getDrawable(c,R.drawable.star_light));
            SharedPreferences.Editor editor = c.getSharedPreferences("lol", MODE_PRIVATE).edit();
            editor.putBoolean("abc" + position, true);
            editor.commit();
            }
            else{
                holder.fav.setBackgroundDrawable(ContextCompat.getDrawable(c, R.drawable.star_off));
                SharedPreferences.Editor editor = c.getSharedPreferences("lol", MODE_PRIVATE).edit();
                editor.putBoolean("abc" + position, false);
                editor.commit();

            }
        }
    });