【问题标题】:RecyclerView first and last item are changed, when clicking only oneRecyclerView的第一项和最后一项发生了变化,当只点击一个时
【发布时间】:2018-12-31 19:04:20
【问题描述】:

我正在使用 recyclerview 来显示可供选择的兴趣列表。单击第一个项目会使最后一个项目也被选中

选择第一项:

最后一项也被选中:

使用以下代码完成选择:

@Override
public InterestViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    TextView v = (TextView) LayoutInflater.from(parent.getContext())
            .inflate(R.layout.interests_textview, parent, false);
    v.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            TextView textView = (TextView) v;
            if (textView.getCompoundDrawables()[2] == null) {
                textView.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.checkmark, 0);
            } else {
                textView.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
            }
        }
    });
    return new InterestViewHolder(v);
}

当点击最后一个项目时,第一个项目也会被选中。 谁知道是什么原因造成的?

【问题讨论】:

  • 你能把你的物品xml分享给适配器吗
  • 您找到解决方案了吗?我正在努力解决同样的问题......

标签: android android-recyclerview


【解决方案1】:

您正在将布局膨胀为TextView。将其更改为View v,它应该可以工作:

View v = LayoutInflater.from(parent.getContext())
        .inflate(R.layout.interests_textview, parent, false);

您还需要使用findViewByID() 才能从您的布局中获得正确的TextView

代替

TextView textView = (TextView) v;

这样做:

TextView textView = findViewById(<id of your textview in the layout>);

View 转换为TextView 不是您想要做的。

【讨论】:

  • 恐怕您的提示都没有帮助。但我确实设法解决了这个问题,只需将点击状态保存在一个对象中,然后检查 onBindViewHolder 中的状态(选择/未选择)。此问题的根本原因是 RecyclerView 已回收视图,因此在下一个回收项目上添加了复选标记。
  • 您的铸件肯定不是 100% 正确,但如果您找到了解决方案,您可以为我们自己的问题写一个答案,然后再接受它。这将帮助下一个遇到类似问题的用户。然后我会删除我的答案,所以你的评论在那之前不会丢失。
【解决方案2】:

我有一个复选框来选择项目和以下字符串数组

data : 保存我所有的物品 checkedData:保存所有选中项

要解决这个问题,请尝试编辑 onBindViewHolder(holder , position)

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

    String title =data[position];
    holder.textTitle.setText(title);

    //logic to solve first and last (multiple) selection issue
    CheckBox chk = holder.chk;
    String current  = data[position];
    chk.setChecked(false);
    for(String st : checkedData){
        if(st.equals(current)){
            chk.setChecked(true);
        }
    }

    holder.setItemClickListener(new ItemClickListener()
    {
        @Override
        public void onItemClick(View v, int pos)
        {
            //here analomay occured 19:36 Custom Reycler view CheckBoxes | anomaly is now cleared.
            CheckBox chk = (CheckBox) v;//.findViewById(R.id.chk);

            if(chk.isChecked())
            {
                   checkedData.add(data[pos]);
            }else if(!chk.isChecked())
            {
                checkedData.remove(data[pos]);
            }



        }
    });
}

解释

每次数据被绑定到 onBindViewHolder 中的持有者时,它都会执行之前取消选中该复选框的操作,然后检查该持有者的相应字符串是否存在于 checkedData 数组中,如果是,则将 checkBox 设置为 true。 em>

【讨论】:

    猜你喜欢
    • 2020-12-23
    • 1970-01-01
    • 2019-01-26
    • 2020-07-20
    • 1970-01-01
    • 2020-07-04
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多