将每个项目的状态分别存储在RecyclerView中

时间:2018-07-17 08:29:45

标签: android android-recyclerview boolean

RecyclerView OnClick无法正常工作。它必须将状态更改为truefalse。当我单击第一个项目时,它将存储true并更改文本。但是,当我单击其他项目时,它会将状态更改为false,因为第一项设置为true,因此文本不会更改。如何分别存储每个项目的状态?

boolean isChange = false;


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

        Window window = windowList.get(position);

        holder.textViewTitle.setText(window.getTitle());
        holder.textViewChecked.setText(window.getCheck());

        holder.imageView.setImageDrawable(mCtx.getResources().getDrawable(window.getImage()));
////////////////////////////////////////////////
        holder.parentLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (!isChange){

                    holder.parentLayout.setBackgroundColor(Color.parseColor("#66BB6A"));
                    holder.textViewChecked.setText("True");
                    isChange = true;

                }

                else {

                    holder.parentLayout.setBackgroundColor(Color.parseColor("#EEEEEE"));
                    holder.textViewChecked.setText("False");
                    isChange = false;

                }

                //Toast.makeText(mCtx, "Clicked", Toast.LENGTH_SHORT).show();

            }
        });
//////////////////////////////////////
    }

2 个答案:

答案 0 :(得分:0)

为什么不使用Map? 我看到您有一些Window模型。因此,您可以在适配器中创建一个映射,并为每个Window键存储一个布尔值:

private Map<Window, Boolean> map = new HashMap<>();

然后获取当前值的值:

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

        Window window = windowList.get(position);

        holder.textViewTitle.setText(window.getTitle());
        holder.textViewChecked.setText(window.getCheck());

        holder.imageView.setImageDrawable(mCtx.getResources().getDrawable(window.getImage()));
////////////////////////////////////////////////
        holder.parentLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                boolean isChange = map.get(window);

                if (!isChange){

                    holder.parentLayout.setBackgroundColor(Color.parseColor("#66BB6A"));
                    holder.textViewChecked.setText("True");
                    map.put(window, true);

                }

                else {

                    holder.parentLayout.setBackgroundColor(Color.parseColor("#EEEEEE"));
                    holder.textViewChecked.setText("False");
                    map.put(window, false);

                }

                //Toast.makeText(mCtx, "Clicked", Toast.LENGTH_SHORT).show();

            }
        });
//////////////////////////////////////
    }

答案 1 :(得分:0)

我希望您有一个setCheck()对象的Window方法,用于存储检查状态。您使用的isChange变量不是特定于项目的,因此它将保留上一个已检查项目的值。
根据您对代码的了解,您应该执行以下操作:

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

    Window window = windowList.get(position);

    holder.textViewTitle.setText(window.getTitle());
    holder.textViewChecked.setText(window.getCheck());

    holder.imageView.setImageDrawable(mCtx.getResources().getDrawable(window.getImage()));

    holder.parentLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (window.getCheck().toString.equals("False")) {
                window.setCheck("True");
                holder.parentLayout.setBackgroundColor(Color.parseColor("#66BB6A"));
                holder.textViewChecked.setText("True");
            } else {
                window.setCheck("False");
                holder.parentLayout.setBackgroundColor(Color.parseColor("#EEEEEE"));
                holder.textViewChecked.setText("False");
            }
        }
    });
}