滚动后无法获取项目视图的标签()
Can't getTag() of itemview after scrolling anymore
我想做的是:我希望 recyclerview
中的项目在单击一次时突出显示,再次单击时恢复正常。
所以我有一个 recyclerview
。当然我也有一个adapter
。内部适配器是我的 viewholder
class,我在 itemview
上设置了 onClickListener
。
每当它被点击时我getTag()
。如果它的值是 "false"
我突出显示 itemview
和 setTag("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
的帮助下完成的
我想做的是:我希望 recyclerview
中的项目在单击一次时突出显示,再次单击时恢复正常。
所以我有一个 recyclerview
。当然我也有一个adapter
。内部适配器是我的 viewholder
class,我在 itemview
上设置了 onClickListener
。
每当它被点击时我getTag()
。如果它的值是 "false"
我突出显示 itemview
和 setTag("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
的帮助下完成的