【问题标题】:Can't getTag() of itemview after scrolling anymore滚动后无法 getTag() 的 itemview
【发布时间】:2017-03-06 06:52:02
【问题描述】:

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

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

每当点击它时,我都会getTag()。如果它的值为"false",我突出显示itemviewsetTag("true"),如果它的值为"true",我将itemview颜色恢复正常和setTag("false")

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

我试过setIsRecycable(false),但没有用。

如何在这些项目上保留标签/突出显示??

编辑: 公共类 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");

        }
    }

【问题讨论】:

标签: android android-recyclerview android-viewholder


【解决方案1】:

跟踪 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;
}
}

在此示例中,视图只是启用/禁用,但它说明了如何实现所需。

【讨论】:

  • 首先感谢您的回答。你以前用过那个代码吗?它真的有效吗?还没有时间尝试一下
  • 我没有使用过这个确切的代码,但我已经多次使用过类似的实现。每当您有时间时,您可能想要使用一堆断点进行调试,以亲自查看代码的行为方式。
【解决方案2】:

解决了!关键是使用 SparseBooleanArray 而不是标签来跟踪所选项目。项目的选择是在 StateListDrawable 的帮助下完成的

how to highlight the selected Item of Recycler View?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-17
    • 1970-01-01
    • 2013-10-06
    相关资源
    最近更新 更多