【问题标题】:Store state for each item separately in RecyclerView在 RecyclerView 中分别存储每个项目的状态
【发布时间】:2018-12-24 21:00:11
【问题描述】:

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();

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

【问题讨论】:

  • 这就是 RecyclerView 的工作方式,您必须将 isChange 存储在您的 Window 类中,或者如果它仅用于后期目的并且不应存储在那里,请创建例如。 Set 或 HashMap 将包含 id 和当前更改状态,并且 viewholder 将不得不在BindView 上请求此数据

标签: android android-recyclerview boolean


【解决方案1】:

我希望你的Window 对象有一个setCheck() 方法,用于存储检查状态。您使用的 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");
            }
        }
    });
} 

【讨论】:

    【解决方案2】:

    为什么不使用地图? 我看到你有一些 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();
    
                }
            });
    //////////////////////////////////////
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-27
      • 2021-09-28
      • 2013-04-29
      • 2019-03-02
      相关资源
      最近更新 更多