滚动后无法获取项目视图的标签()

Can't getTag() of itemview after scrolling anymore

我想做的是:我希望 recyclerview 中的项目在单击一次时突出显示,再次单击时恢复正常。

所以我有一个 recyclerview。当然我也有一个adapter。内部适配器是我的 viewholder class,我在 itemview 上设置了 onClickListener

每当它被点击时我getTag()。如果它的值是 "false" 我突出显示 itemviewsetTag("true"),如果它的值是 "true" 我把 itemview 颜色恢复正常并且 setTag("false").

到目前为止一切正常,但现在问题来了: 当我向上滚动(这样项目就看不见了)并再次向下滚动时,标签的值似乎也消失了,项目也突出显示了。

我尝试了 setIsRecycable(false) 但没有用。

如何保留这些项目的 tags/highlighting?

编辑: public class ViewHolder 扩展 RecyclerView.ViewHolder 实现 View.OnClickListener,View.OnLongClickListener {

final RelativeLayout rl = (RelativeLayout)itemView.findViewById(R.id.rl1);
final RelativeLayout rl2 = (RelativeLayout)itemView.findViewById(R.id.rl2);
public ViewHolder(final View itemView) {
    super(itemView);

    itemView.setTag("f");


        //text layout
        mSenderUsernameView = (TextView) itemView.findViewById(R.id.tv_username);
        mSenderMessageView = (TextView) itemView.findViewById(R.id.et_message);
        mSenderTimeView = (TextView) itemView.findViewById(R.id.tv_time);

        mSenderUsernameView.setOnClickListener(this);
        mSenderMessageView.setOnClickListener(this);
        mSenderTimeView.setOnClickListener(this);
        rl.setOnClickListener(this);
        rl2.setOnClickListener(this);

        }   

@Override
public void onClick(View v) {
    if (v.getId() == rl.getId() || v.getId() == rl2.getId() || v.getId() == mSenderUsernameView.getId() ||
            v.getId() == mSenderMessageView.getId() || v.getId() == mSenderTimeView.getId()) {


        //check if msg is selected or not
        //not selected
        if(itemView.getTag().toString().equals("f")){                rl.setBackgroundResource(R.drawable.selected_msg_color_roundings);
            rl2.setBackgroundResource(R.drawable.selected_msg_color_roundings);
            itemView.setTag("t");
        }
        //selected
        else if(itemView.getTag().toString().equals("t")){
            //Toast.makeText(context, mMessages.get(getAdapterPosition()).getUsername()
            //+ " at " + mPos + " is " + va, Toast.LENGTH_LONG).show();
            rl.setBackgroundResource(R.drawable.msg_color_roundings);
            rl2.setBackgroundResource(R.drawable.msg_color_roundings);

            itemView.setTag("f");

        }
    }

跟踪 RecyclerView 中哪些位置被点击的方法是在适配器中使用内部数据集,如下所示:

public class RVAdapter extends RecyclerView.Adapter<RVAdapter.ViewHolder> {

boolean[] dataset;
public class ViewHolder extends RecyclerView.ViewHolder {
    RelativeLayout mRelativeLayout;

    public ViewHolder(RelativeLayout v) {
        super(v);
        mRelativeLayout = v;
    }
}

public RVAdapter(boolean[] dataset) {
    this.dataset = dataset;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    RelativeLayout v = (RelativeLayout) LayoutInflater.from(parent.getContext())
            .inflate(R.layout.rv_item, parent, false);
    return new ViewHolder(v);
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    holder.mRelativeLayout.setTag(position);
    holder.mRelativeLayout.setEnabled(dataset[position]);
    holder.mRelativeLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            int position = (int) view.getTag();
            dataset[position] = !dataset[position];
        }
    });
}

@Override
public int getItemCount() {
    return dataset.length;
}
}

在此示例中,视图只是 enabled/disabled,但它说明了如何实现您的需求。

解决了!关键是使用 SparseBooleanArray 而不是标签来跟踪选定的项目。项目的选择是在 StateListDrawable

的帮助下完成的