我有一个 RecyclerView
,其中每个元素都有一个 onClickEventListener()
来更改其外观。它工作正常,但我实际上需要更改所有其他元素的外观。具体来说,我需要单击的元素填充颜色,其他元素应该只有描边。我认为有更优雅的方法来做到这一点,而不是迭代 RecyclerView
的所有元素的数组。
我当前的代码如下所示:
vh.mImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
GradientDrawable typeShape = (GradientDrawable) vh.mImageView.getDrawable();
if (vh.clicked) {
typeShape.setColor(Color.parseColor("#00ff5800"));
} else {
typeShape.setColor(Color.parseColor("#ff5800"));
}
vh.clicked = !vh.clicked;
}
});
最佳答案
在我看来,“最好”的方法是使用大多数人不熟悉的 RecyclerView API 的一部分:例如notifyItemRangeChanged()
接受有效负载对象。
当您传递有效负载对象时,将调用 onBindViewHolder()
的特殊版本,并且该有效负载将传递给此方法。
这一切让您可以非常有效地重新绑定(bind)任何显示的 ViewHolder 对象,并且仅更新您知道已更改的 View 部分。
在您的特定示例中,您可以让适配器跟踪 selectedPosition
并让您的 onBindViewHolder()
方法根据项目的位置是否设置项目的背景等于当前选定的位置:
private void updateBackground(ViewHolder holder, int position) {
holder.itemView.setBackgroundResource(
(position == selectedPosition) ? R.drawable.highlight : R.drawable.stroke);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
updateBackground(holder, position);
// other view binding stuff
}
然后您还可以实现特殊的 onBindViewHolder()
调用来进行部分更新:
@Override
public void onBindViewHolder(ViewHolder holder, int position, List<Object> payloads) {
if (payloads != null && payloads.contains("BACKGROUND")) {
updateBackground(holder, position);
}
}
一旦您完成这两项设置,只要所选位置发生更改,您就可以调用:
adapter.selectedPosition = 23; // or whatever else
adapter.notifyItemRangeChanged(0, adapter.getItemCount(), "BACKGROUND");
当您调用这个特殊版本的notifyItemRangeChanged()
时,系统将调用您的特殊onBindViewHolder()
,您将有机会重新绘制背景所有当前可见的 View 。但是您不会浪费时间更新任何当前不可见的 View ,也不会浪费时间绑定(bind)根本没有更改的数据(规范中的所有“其他 View 绑定(bind)内容”onBindViewHolder()
实现)。
关于java - 如何通过 onClick 事件更改 RecyclerView 中的所有元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53599093/