【问题标题】:How to save or change each row state on recyclerview item clicked?如何在单击的 recyclerview 项目上保存或更改每一行状态?
【发布时间】:2018-03-23 10:17:21
【问题描述】:

我创建了一个水平的recyclerview 列表。下面是我附上的图片。 问题是每次用户从关闭状态单击该行到打开状态以及从打开状态到关闭状态时,我都必须更改灯泡状态。 我如何实现这个逻辑?请帮我找出解决方案。 我想根据用户点击来改变灯光颜色,如果他点击了,那么它应该改变该行的颜色,反之亦然

public void onClick(View view, int position) {
            //toast("clicked" + position );
            if (!lightClicked){
                ImageView lightPopUp = view.findViewById(R.id.row_light_thumbnail);
                DrawableCompat.setTint(lightPopUp.getDrawable().mutate(), ContextCompat.getColor(getContext(), R.color.white));
                //toast("light on");
                lightClicked = true;
            }else {
                ImageView lightPopUp = view.findViewById(R.id.row_light_thumbnail);
                //toast("light off");
                DrawableCompat.setTint(lightPopUp.getDrawable().mutate(), ContextCompat.getColor(getContext(), R.color.colorAccent));
                lightClicked = false;
            }
            //View view1 = mLayoutManager.findViewByPosition(position);


        }

【问题讨论】:

  • 可以创建监听器(onclick),根据状态改变图片
  • 如果所有元素都处于关闭状态,如果单击其他元素会进入打开状态,反之亦然,即用户再次单击该元素会返回原始状态或关闭状态。
  • 什么简单的逻辑?
  • 只检查 if 条件中的状态 if on then on_image 如果 off 然后 off_image 在 recyclerview 适配器 onbind 方法中检查状态
  • 使用 notifyDataSetChanged(); onclick里面的方法。

标签: android android-layout android-studio android-fragments android-recyclerview


【解决方案1】:

不要直接进行此更改,因为回收站视图的单元格会被重复使用,并且不会按预期工作,因此请在您正在使用的列表中应用更改。您可以在用于填充回收器视图的列表的模型类中添加一个布尔变量,然后单击它可以更改布尔值并在适配器上调用 notifydatasetchange,并且在绑定视图中,您应该保留 If else 条件基于灯泡图像的布尔值 IE。如果为真,则设置一张图像,如果为假,则设置另一张图片

【讨论】:

  • 其实我没有使用模型类。我正在使用 ArrayList
  • 然后你可以创建一个带有一个字符串和布尔值的模型类,并将其用作 arraylist 中的对象
  • 我一定会的。
【解决方案2】:

声明:

int selectedPosition=-1;

onBindViewHolder 内部:

public void onBindViewHolder(FiltersAdapter.ViewHolder holder, int position) {
if(selectedPosition==position)
  holder.itemView.setImageResource(R.drawable.higlihgt_image);
else
   holder.itemView.setImageResource(R.drawable.normal_image);

holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                selectedPosition=position;
                notifyDataSetChanged();

            }
        });
}

【讨论】:

  • 所以这适用于所有行点击或者我需要声明每个项目的位置?
  • globaly 定义这个 int .... 并根据我的解决方案替换你的...它肯定会工作
  • 以上答案解决了我的问题。并感谢您的回答
猜你喜欢
  • 2019-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-02
  • 2021-09-30
  • 1970-01-01
  • 2021-10-28
相关资源
最近更新 更多