我的问题是:我有一个视频流发生在一个视图内的RecyclerView。
当用户滚动时,视图会被回收,其他相机会在回收的浏览者上开始自己的流式传输。这对用户交互界面不利,因为流式传输过程需要几秒钟才能开始。
我怎么能对回收商说:“嘿,回收商,请不要回收那个确切的位置x,给那个位置总是你第一次给它的相同的浏览者,而不是随机的一个”?
请谁帮帮我=(
在适配器的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);
我希望这能解决你的问题谢谢