java - 如何通过 onClick 事件更改 RecyclerView 中的所有元素?

标签 java android

我有一个 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() 接受有效负载对象。

https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter#notifyitemrangechanged

当您传递有效负载对象时,将调用 onBindViewHolder() 的特殊版本,并且该有效负载将传递给此方法。

https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html#onbindviewholder_5

这一切让您可以非常有效地重新绑定(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/

相关文章:

java - 使用eclipse sdk

java - 这条java行是做什么的

java - 使用 Java 从共享点检索数据并对其进行处理的最佳方法是什么?

android - 使用 CoordinatorLayout 时 AdView 和 FloatingActionButton 重叠

android - 解析XML并在TextView中显示

Java mmap 在 Android 上失败并显示 "mmap failed: ENOMEM (Out of memory)"

java - 在使用 JNI 将 c++ unordered_map 返回到 java 之前将其转换为 java hashMap

java - 在 Gnome 桌面上打开 .jar 文件

android - 列未在 sqlite 数据库中创建?

android - 如何在Android Audio Capture示例中更改按钮的位置?