提问者:小点点

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


我的问题是:我有一个视频流发生在一个视图内的RecyclerView。

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

我怎么能对回收商说:“嘿,回收商,请不要回收那个确切的位置x,给那个位置总是你第一次给它的相同的浏览者,而不是随机的一个”?

请谁帮帮我=(


共3个答案

匿名用户

在适配器的getItemViewType(int位置)方法中,为每个视频分配唯一值,因此它将始终为您希望的相同视频返回相同的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);

         }
    }

匿名用户

在您不想被回收的ViewHolder上执行viewHolder. setIsRecyclable(false)

来自ViewHolder#setIsRecyclable(布尔值)的文档:

通知回收者此项是否可以回收。不可回收的视图将不会重复用于其他项,直到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);
    }
    ...
}

匿名用户

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

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

viewHolder.setIsRecyclable(false);

此声明停止回收意见。

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

viewHolder.setIsRecyclable(true);

我希望这能解决你的问题谢谢