Android 仅单击一项时,将更改RecyclerView第一项和最后一项

Android 仅单击一项时,将更改RecyclerView第一项和最后一项,android,android-recyclerview,Android,Android Recyclerview,我正在使用recyclerview显示一个兴趣列表,可以从中选择。单击第一个项目会使最后一个项目也处于选中状态 选择第一项: 最后一项也被选中: 使用以下代码完成选择: @Override public InterestViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { TextView v = (TextView) LayoutInflater.from(parent.getContext())

我正在使用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);
}
单击最后一个项目时,也会选择第一个项目。
谁知道是什么原因导致了这种情况?

您正在将版面膨胀为
TextView
。将其更改为查看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>);
TextView TextView=findViewById();

视图
强制转换为
文本视图
不是您想要做的。

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

数据:保存我的所有项目 checkedData:保存所有选中的项目

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

解释


它将做的是每次数据绑定到onBindViewHolder中的holder时,您之前取消选中该复选框,然后检查该holder的对应字符串是否存在于checkedData数组中(如果是),如果将复选框设置为true。

您能与Adapter共享您的项目xml吗找到解决方案了吗?我也在为同一个问题而挣扎……恐怕我得说,你的建议没有一个是有用的。但我确实解决了这个问题,只需在对象中保存单击状态,然后在onBindViewHolder中检查状态(已选择/未选择)。此问题的根本原因是RecyclerView回收了视图,因此在下一个回收项目上添加了复选标记。您的铸件肯定不是100%正确,但如果您找到了解决方案,您可以为我们自己的问题写一个答案,然后接受它。这将帮助下一个用户解决类似的问题。然后我会删除我的答案,这样在那之前你的评论不会丢失。
 @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]);
            }



        }
    });
}