java - 回收 recyclerview 时应用程序的布局被破坏

标签 java android

我正在尝试构建一个 Android 应用程序,在其中使用 RecyclerView

RecyclerView 的项目中,我使用一个 TextView 和四个 CheckBox 来选择任何人。

现在,当我选择一个 CheckBox 时,其他复选框将根据我编写的代码被禁用。现在的问题是,当我在选择复选框后回收 RecyclerView 时,另一个将在没有任何选择的情况下被禁用。

当我从 RecyclerView 底部选择复选框时,也会发生同样的情况,上面的复选框也会被禁用。

我想解决这个问题。

这是我在适配器类中的代码。

@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) {
    final Food foodItems = foodList.get(position);
    holder.txtPersonName.setText(foodItems.getPersonNames());
    holder.chkSavour.setChecked(foodItems.getChkSavour());
    holder.chkBurgur.setChecked(foodItems.getChkBurgur());
    holder.chkKrrahi.setChecked(foodItems.getChkKrrahi());

    holder.chkSavour.setTag(position);
    holder.chkSavour.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Integer pos = (Integer) holder.chkSavour.getTag();
            if (!foodList.get(pos).getChkSavour()){
                foodList.get(pos).setChkSavour(true);
                holder.chkKrrahi.setEnabled(false);
                holder.chkBurgur.setEnabled(false);
                holder.chkNone.setEnabled(false);
            } else {
                foodList.get(pos).setChkSavour(false);
                holder.chkBurgur.setEnabled(true);
                holder.chkKrrahi.setEnabled(true);
                holder.chkNone.setEnabled(true);
            }
        }
    });
    holder.chkBurgur.setTag(position);
    holder.chkBurgur.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Integer pos = (Integer) holder.chkBurgur.getTag();
            if (!foodList.get(pos).getChkBurgur()){
                foodList.get(pos).setChkBurgur(true);
                holder.chkSavour.setEnabled(false);
                holder.chkKrrahi.setEnabled(false);
                holder.chkNone.setEnabled(false);
            } else {
                foodList.get(pos).setChkBurgur(false);
                holder.chkSavour.setEnabled(true);
                holder.chkKrrahi.setEnabled(true);
                holder.chkNone.setEnabled(true);
            }
        }
    });
    holder.chkKrrahi.setTag(position);
    holder.chkKrrahi.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Integer pos = (Integer) holder.chkKrrahi.getTag();
            if (!foodList.get(pos).getChkKrrahi()){
                foodList.get(pos).setChkKrrahi(true);
                holder.chkSavour.setEnabled(false);
                holder.chkBurgur.setEnabled(false);
                holder.chkNone.setEnabled(false);
            } else {
                foodList.get(pos).setChkKrrahi(false);
                holder.chkSavour.setEnabled(true);
                holder.chkBurgur.setEnabled(true);
                holder.chkNone.setEnabled(true);
            }
        }
    });
}

    @Override
    public int getItemCount() {
        return foodList.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        private TextView txtPersonName;
        private CheckBox chkSavour;
        private CheckBox chkBurgur;
        private CheckBox chkKrrahi;
        private CheckBox chkNone;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            txtPersonName = itemView.findViewById(R.id.txtName);
            chkSavour = itemView.findViewById(R.id.chkSavour);
            chkBurgur = itemView.findViewById(R.id.chkBurgur);
            chkKrrahi = itemView.findViewById(R.id.chkKrrahi);
            chkNone = itemView.findViewById(R.id.chkNone);
        }
    }
}

最佳答案

您错过了查看启用/禁用部分。设置复选框检查状态后添加以下行。

holder.chkSavour.setChecked(foodItems.getChkSavour());
holder.chkBurgur.setChecked(foodItems.getChkBurgur());
holder.chkKrrahi.setChecked(foodItems.getChkKrrahi());

//Add this
if(foodItems.isSelected()){
    holder.chkSavour.setEnabled(foodItems.getChkSavour())
    holder.chkKrrahi.setEnabled(foodItems.getChkKrrahi());
    holder.chkBurgur.setEnabled(foodItems.getChkBurgur());
    holder.chkNone.setEnabled(foodItems.getChkNone());
}else{
    holder.chkSavour.setEnabled(true)
    holder.chkKrrahi.setEnabled(true);
    holder.chkBurgur.setEnabled(true);
    holder.chkNone.setEnabled(true);
}

在模型中添加一个 boolean 变量来保存用户偏好设置是否已选择的状态。

holder.chkSavour.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Integer pos = (Integer) holder.chkSavour.getTag();
        if (!foodList.get(pos).getChkSavour()){
            foodList.get(pos).setChkSavour(true);
            foodList.get(pos).setSelected(true); //Used to apply view Enable logic
            holder.chkKrrahi.setEnabled(false);
            holder.chkBurgur.setEnabled(false);
            holder.chkNone.setEnabled(false);
        } else {
            foodList.get(pos).setChkSavour(false);
            foodList.get(pos).setSelected(false); //Reset the disabled check box
            holder.chkBurgur.setEnabled(true);
            holder.chkKrrahi.setEnabled(true);
            holder.chkNone.setEnabled(true);
        }
    }
});

关于java - 回收 recyclerview 时应用程序的布局被破坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59766836/

相关文章:

java - 在java中模拟ExecutorService invokeAll方法

java - 使用来自多个 selectOneMenus 和按钮的内容填充 inputTextArea

java - Java 或 C# 中是否存在命名空间污染(如在 C++ 中)?

android - 如何将数据从 onSuccess 传递到其他类?

java - "Ionic build android"错误

java - 面向对象语言和非面向对象语言有什么区别?

java - Android MediaPlayer 在它自己的类中导致应用程序崩溃

android - 那么下一步按钮在新的 Activity 窗口中不起作用

android - 如何从表面 View 创建和保存屏幕截图?

Android 弹出菜单 "could not find class android.widget.PopupMenu'