如何解决为什么 RecyclerView 项只有在点击两次后才会改变背景颜色?
我一直在探索 Recyclerview 和 Cardview,但偶然发现了一个我不知道如何处理的问题。我的 recyclerview 工作正常,但是当我使 recyclerview 的项目背景在单击时更改颜色时,它的行为很奇怪。
好的,recyclerview 正常加载,但是当我第一次单击一个项目时,项目背景颜色会闪烁其新颜色,但随后保持其默认颜色。当我第二次点击任何项目时,只有当 recyclerview 的项目改变它的背景颜色时,它才会随着项目的其余部分被点击。
从我添加到代码中的 Log.d
中,我发现第一次点击与第二次(以及其余)点击的不同之处在于 {{1} 类中的公共 PremiseAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,int viewType)
}.我发现了一个与我的问题相似的 question,但我认为我的代码不是这样工作的。
日志如下。
- 加载 recyclerview 及其 Cardview 项
PremiseAdapter
- 首先点击项目
.... D/rcvTest: PremiseAdapter.PremiseAdapter
.... D/rcvTest: PremiseAdapter.getItemCount
.... D/rcvTest: PremiseAdapter.getItemCount
.... D/rcvTest: ---------------------> PremiseAdapter.ViewHolder.onCreateViewHolder
.... D/rcvTest: [ViewHolder].ViewHolder.TOP
.... D/rcvTest: PremiseAdapter.onBindViewHolder
.... D/rcvTest: [ViewHolder].bindTo.TOP: FroyYo Mart
.... D/rcvTest: [ViewHolder].bindTo.BOTTOM FroyYo Mart
.... D/rcvTest: PremiseAdapter.onBindViewHolder.get(position)
.... D/rcvTest: PremiseAdapter.getItemCount
.... D/rcvTest: ---------------------> PremiseAdapter.ViewHolder.onCreateViewHolder
.... D/rcvTest: [ViewHolder].ViewHolder.TOP
.... D/rcvTest: PremiseAdapter.onBindViewHolder
.... D/rcvTest: [ViewHolder].bindTo.TOP: Ice Cream Store
.... D/rcvTest: [ViewHolder].bindTo.BOTTOM Ice Cream Store
.... D/rcvTest: PremiseAdapter.onBindViewHolder.get(position)
- 第二次(以及其他)点击该项目
.... D/rcvTest: [ViewHolder].ViewHolder.listener: null
.... D/rcvTest: [ViewHolder].ViewHolder.getAdapterPosition(): 1
.... D/rcvTest: [ViewHolder].ViewHolder.position: 1
.... D/rcvTest: getLayoutPosition(): 1
.... D/rcvTest: [ViewHolder].ViewHolder.position != RecyclerView.NO_POSITION
.... D/rcvTest: PremiseAdapter.getItemCount
.... D/rcvTest: PremiseAdapter.getItemCount
.... D/rcvTest: ---------------------> PremiseAdapter.ViewHolder.onCreateViewHolder
.... D/rcvTest: [ViewHolder].ViewHolder.TOP
.... D/rcvTest: PremiseAdapter.onBindViewHolder
.... D/rcvTest: [ViewHolder].bindTo.TOP: Ice Cream Store
.... D/rcvTest: [ViewHolder].bindTo.BOTTOM Ice Cream Store
.... D/rcvTest: PremiseAdapter.onBindViewHolder.get(position)
这是我的 .... D/rcvTest: [ViewHolder].ViewHolder.listener: null
.... D/rcvTest: [ViewHolder].ViewHolder.getAdapterPosition(): 0
.... D/rcvTest: [ViewHolder].ViewHolder.position: 0
.... D/rcvTest: getLayoutPosition(): 0
.... D/rcvTest: [ViewHolder].ViewHolder.position != RecyclerView.NO_POSITION
.... D/rcvTest: PremiseAdapter.getItemCount
.... D/rcvTest: PremiseAdapter.getItemCount
.... D/rcvTest: PremiseAdapter.onBindViewHolder
.... D/rcvTest: [ViewHolder].bindTo.TOP: FroyYo Mart
.... D/rcvTest: [ViewHolder].bindTo.BOTTOM FroyYo Mart
.... D/rcvTest: PremiseAdapter.onBindViewHolder.get(position)
.... D/rcvTest: PremiseAdapter.getItemCount
文件,其中包含我的 PremiseAdapter.java
类和 PremiseAdapter
类。
ViewHolder
解决方法
我通常在 onbindviewholder 中实现 onclick 侦听器,它们似乎工作正常。我建议你应该尝试一下。
把这段代码移到onbindviewholder
int clickedColor = Color.parseColor("#D5F5E3");
/*itemView.setBackgroundColor(defaultColor);*/
holder.itemView.setOnClickListener((v) -> {
int position = getAdapterPosition();
Log.d("rcvTest","[ViewHolder].ViewHolder.listener: " + listener);
Log.d("rcvTest","[ViewHolder].ViewHolder.getAdapterPosition(): " + getAdapterPosition());
Log.d("rcvTest","[ViewHolder].ViewHolder.position: " + position);
Log.d("rcvTest","getLayoutPosition(): " + getLayoutPosition());
if (position != RecyclerView.NO_POSITION) {
Log.d("rcvTest","[ViewHolder].ViewHolder.position != RecyclerView.NO_POSITION");
/*listener.onItemClick(position);*/
itemView.setBackgroundColor(clickedColor);
} else if (position == RecyclerView.NO_POSITION) {
Log.d("rcvTest","[ViewHolder].ViewHolder.position == RecyclerView.NO_POSITION");
itemView.setBackgroundColor(clickedColor);
}
notifyItemChanged(position);
position = getLayoutPosition();
notifyItemChanged(position); //duplicate
});
只要确保改变
itemView.setOnClickListener(...) to holder.itemView.setOnClickListener(...)
,
试试这个。最近我编写了这个代码并且它工作正常,希望它也能解决你的问题。
int row_index = -1;
holder.itemView.setOnClickListener(v -> {
row_index = position;
notifyDataSetChanged();
});
if (row_index == position) {
holder.layout.setBackgroundColor(Color.parseColor("#ff6600"));
} else {
holder.layout.setBackgroundColor(Color.parseColor("#ffffff"));
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。