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

Dan*_*ira 19 android recycle android-layout android-viewholder android-recyclerview

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

当用户滚动时,视图将被回收,其他摄像头会在该回收的视图持有者上开始自己的流式传输.这对用户界面不利,因为流式处理需要几秒钟才能启动.

我怎么能对RecyclerView说:"嘿嘿回收器,请不要回收那个确切的位置x并给出那个位置总是与你第一次给出的相同的观察者,而不是随机的一个"?

请有人帮帮我=(

Dar*_*ish 16

在您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);

         }
    }
Run Code Online (Sandbox Code Playgroud)


azi*_*ian 13

执行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);
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • 我尝试过这个。但问题是:该视图不会为任何项目回收,即使是原始视图也不会......因此,当回收器再次到达相机时,它将创建另一个视图。 (3认同)
  • onBindViewHolder 或 onCreateViewHolder。这个方法完全符合它的要求:它不会回收视图,但会创建另一个视图,但仍然不能解决问题 (2认同)
  • 伙计,感谢您的努力,我尝试了您的代码,但在显示视频卡后它仍然提供不同的持有人。我正在通过 viewholder's.hascode() 方法检查它们是不同的 =( (2认同)

Ama*_*yal 5

当RecyclerView包含一次未在屏幕上显示的列表时,它会多次使用一个视图(意味着一个列表包含大量项目,这些项目在您需要上下滚动时不会同时显示在屏幕上)。当用户滚动列表时,屏幕外项目将被重用以显示其余列表项目,这称为回收。

要停止回收项目,请在您的onBindViewHolder方法中调用此方法:

viewHolder.setIsRecyclable(false);
Run Code Online (Sandbox Code Playgroud)

此语句停止回收视图。

要开始回收项目,请在您的onBindViewHolder方法中调用此方法:

viewHolder.setIsRecyclable(true);
Run Code Online (Sandbox Code Playgroud)

我希望这能解决您的问题。谢谢

  • 其实这解决不了。它将创建一个新的,而不是回收。我的愿望是永不回收,永不创建新的,但始终使用相同的。 (8认同)