仅点击一个

时间:2018-05-06 19:08:00

标签: android android-recyclerview

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

选择第一项:

RecyclerView first item selected

还选择了最后一项:

RecyclerView last item selected

使用以下代码完成选择:

@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);
}

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

2 个答案:

答案 0 :(得分: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并不是您想要做的。

答案 1 :(得分:0)

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

数据:保存我所有的物品 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>