【问题标题】:RecyclerView : exclude a view from being refreshedRecyclerView : 排除视图被刷​​新
【发布时间】:2018-09-18 05:50:46
【问题描述】:

我有一个显示 YouTube 视频缩略图的 RecyclerView。我想在某些位置调用 notifyItemChanged() 方法时排除这些缩略图的刷新。

这是我的适配器:

public class VideosAdapter extends RecyclerView.Adapter<VideosAdapter.ViewHolder> {

    private List<Video> videos;

    private Animation loadingRotation;

    public VideosAdapter(Context context, List<Video> videos) {
        this.videos= videos;

        loadingRotation = AnimationUtils.loadAnimation(context, R.anim.refresh_btn);
        loadingRotation.setRepeatCount(Animation.INFINITE);
    }

    @NonNull
    @Override
    public VideosAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        if (parent instanceof RecyclerView) {
            LayoutInflater inflater = LayoutInflater.from(parent.getContext());
            VideoItemLayoutBinding binding = DataBindingUtil.inflate(inflater, R.layout.video_item_layout,
                    parent, false);
            ViewHolder holder = new ViewHolder(binding);

            return holder;
        } else {
            throw new RuntimeException("Something is wrong with the RecyclerView");
        }
    }

    @Override
    public void onBindViewHolder(@NonNull VideosAdapter.ViewHolder holder, int position) {
        //views that would update

        //I want to exclude this:

        holder.b.thumbnail.startAnimation(loadingRotation);
        holder.b.thumbnail.initialize(YOUTUBE_API_KEY, new YouTubeThumbnailView.OnInitializedListener() {
            @Override
            public void onInitializationSuccess(YouTubeThumbnailView youTubeThumbnailView,
                                                YouTubeThumbnailLoader youTubeThumbnailLoader) {
                youTubeThumbnailLoader.setVideo(videos.get(position));
                youTubeThumbnailLoader.setOnThumbnailLoadedListener(new YouTubeThumbnailLoader.OnThumbnailLoadedListener() {
                    @Override
                    public void onThumbnailLoaded(YouTubeThumbnailView youTubeThumbnailView, String s) {
                        youTubeThumbnailView.clearAnimation();
                        youTubeThumbnailView.setBackground(null);
                        youTubeThumbnailLoader.release();
                    }

                    @Override
                    public void onThumbnailError(YouTubeThumbnailView youTubeThumbnailView,
                                                 YouTubeThumbnailLoader.ErrorReason errorReason) {
                        youTubeThumbnailView.clearAnimation();
                        youTubeThumbnailLoader.release();
                    }
                });
            }

            @Override
            public void onInitializationFailure(YouTubeThumbnailView youTubeThumbnailView,
                                                YouTubeInitializationResult youTubeInitializationResult) {

            }
        });
    }

    @Override
    public int getItemCount() {
        return ads.size();
    }

    class ViewHolder extends RecyclerView.ViewHolder {

        VideoItemLayoutBinding b;

        ViewHolder(@NotNull VideoItemLayoutBinding binding) {
            super(binding.getRoot());
            this.b = binding;
        }
    }
}

video_item_layout.xml

中的缩略图声明
    <com.google.android.youtube.player.YouTubeThumbnailView
        android:id="@+id/thumbnail"
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:layout_marginBottom="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:background="@drawable/loading_thumbnail"
        android:contentDescription="@string/video_thumbnail_description"/>

我使用了在加载缩略图时播放的动画(旋转进度条),并在缩略图准备好时停止。

我尝试将thumbnail.initialize() 放入onCreateViewHolder()ViewHolder() 构造函数中,但仍然没有,当我调用notifyItemChanged() 时,缩略图总是被重新加载。

提前谢谢你。

【问题讨论】:

  • 你应该为你的列表对象添加一个布尔值,最初它会是假的,然后在你的缩略图加载后第一次它会是真的,然后你可以根据你的要求进行任何检查
  • @SahilKumar 不,那没用。这个想法似乎是正确的,但我认为YoutubeThumbnailView 本身存在问题。我找不到将视图锁定到加载的缩略图的方法。

标签: android thumbnails android-recyclerview android-youtube-api


【解决方案1】:

您可以重写 notifyItemChanged() 方法,如下所示

@Override
public void notifyItemChanged(int position){
if(position!=THE_POSITION_WHERE_YOU_DONT_WANTED_TO_REFRESH){
super.notifyItemChanged(position);
}
}

【讨论】:

  • 你没有得到我的问题。我不想在调用notifyItemChanged() 时只刷新缩略图,而不是排除整个项目。缩略图是 item_layout 中我想要刷新的元素之一。
【解决方案2】:

您可以选择其中一种回收视图方法

notifyItemChanged(int position, Object payload)
notifyItemChanged(int position)
notifyItemRangeChanged(int positionStart, int itemCount, Object payload)
notifyItemRangeChanged(int positionStart, int itemCount)

根据您的要求,它不会刷新整个回收视图项目,而是刷新选定的项目。更多详情可以参考official docs

关于payload,从文档中很清楚

客户端可以选择传递有效负载以进行部分更改。这些 有效负载将被合并并可能传递给适配器 onBindViewHolder(ViewHolder, int, List) 如果项目已经存在 由 ViewHolder 表示,它将被反弹到相同的 视图持有者。带有空负载的 notifyItemRangeChanged() 将清除 该项目上所有现有的有效载荷,并阻止未来的有效载荷,直到 onBindViewHolder(ViewHolder, int, List) 被调用。适配器不应该 假设负载将始终传递给 onBindViewHolder(), 例如当视图未附加时,有效负载将简单 掉了。

【讨论】:

  • 你能告诉我如何使用这个Object payload,我没有得到文档。
  • 不,没有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-17
  • 1970-01-01
  • 2017-09-02
相关资源
最近更新 更多