如何让 RecyclerView 停止回收定义的位置?

新手上路,请多包涵

我的问题是:我在 RecyclerView 中的一个视图上发生了视频流。

当用户滚动时,视图将被回收,其他相机会在该回收的取景器上开始自己的流式传输。这对用户界面不利,因为流式传输过程需要几秒钟才能开始。

我怎么能对 RecyclerView 说:“嘿 Recycler,拜托,不要回收那个确切的位置 x 并给那个位置 总是 你第一次给它的同一个 viewholder,而不是随机的”?

请有人帮助我=(

原文由 Daniel Oliveira 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 930
2 个回答

在您的 getItemViewType(int position) 适配器方法中,为每个视频分配唯一值,因此它将始终根据您的意愿为同一视频返回相同的 ViewHolder。

  • 返回唯一正数作为每种视频类型的类型(这里我使用适配器位置作为唯一键)
  • 返回任何非视频项目的负数。 (这里没什么特别的,只是为了避免和视频项冲突,我们对非视频项使用负数)

我希望你明白了。欢呼:)

     @Override
    public int getItemViewType(int position) {
        // Just as an example, return 0 or 2 depending on position
        // Note that unlike in ListView adapters, types don't have to be   contiguous
        if(dataList.get(position).isVideo()){
            return position;

        }else{
            return -1;//indicates general type, if you have more types other than video, you can use -1,-2,-3 and so on.
        }
    }

 @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
         switch (viewType) {
             case -1:  View view1 = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.general_item, parent, false);
                     return new GeneralViewHolder(view1);
             default:View view2 = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.video_item, parent, false);
                     return new VideoViewHolder(view2);

         }
    }

原文由 Darish 发布,翻译遵循 CC BY-SA 3.0 许可协议

viewHolder.setIsRecyclable(false) ViewHolder不想 被回收。

来自 ViewHolder#setIsRecyclable(boolean) 的文档

通知回收商该项目是否可以回收。在 setIsRecyclable() 稍后设置为 true 之前,不可回收的视图不会被其他项目重用。

这将导致只创建一个 ViewHolder

 public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    ...
    @Override
    public void onViewAttachedToWindow(final RecyclerView.ViewHolder holder) {
        if (holder instanceof VideoViewHolder) {
            holder.setIsRecyclable(false);
        }
        super.onViewAttachedToWindow(holder);
    }

    @Override
    public void onViewDetachedFromWindow(final RecyclerView.ViewHolder holder) {
        if (holder instanceof VideoViewHolder){
            holder.setIsRecyclable(true);
        }
        super.onViewDetachedFromWindow(holder);
    }
    ...
}

原文由 azizbekian 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题