为什么 viewpager2 在 list.why 的 5 张图像后重复显示相同的图像?
Why viewpager2 display same images repeatedly after 5 images from a list.why?
我正在使用 viewpager2 创建图像和视频滑块。我为此使用了 recyclerviewadapter。我的代码如下。从文件加载到 imageview correctly.My 列表的位图有 14 个项目(图像和视频)。但是 linearlayout.addview 只显示重复的图像。显示 5 张图像后,它从 1 开始。为什么这些图像重复..请帮助..我的 recylerview 适配器 class 在下面给出..这有什么问题
public SlideViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_slidescreen, parent, false);
return new SlideViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull SlideViewHolder holder, int position) {
Log.d("CHKck", position + " " + getItemCount());
StatusModel statusModel = itemList.get(position);
File file = statusModel.getFile();
Log.d("CHKfileadapt", String.valueOf(file) + " " + position);
if (file.exists()) {
if (statusModel.isVideo) {
LinearLayout linearLayout = new LinearLayout(context);
linearLayout.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
linearLayout.setGravity(Gravity.FILL);
linearLayout.setOrientation(LinearLayout.VERTICAL);
VideoView videoView = new VideoView(context);
videoView.setVideoPath(file.getAbsolutePath());
videoView.setMediaController(new MediaController(context));
holder.linearLayout.addView(videoView);
} else {
Log.d("CHK", "image");
holder.linearLayout.setOrientation(LinearLayout.VERTICAL);
holder.linearLayout.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
ImageView imageView = new ImageView(context);
Bitmap bitmap = BitmapFactory.decodeFile(statusModel.getPath());
imageView.setImageBitmap(bitmap);
imageView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
holder.linearLayout.addView(imageView);
}
}
}
@Override
public int getItemCount() {
return itemList.size();
}
public class SlideViewHolder extends RecyclerView.ViewHolder {
private LinearLayout linearLayout;
private List<Integer> poslist = new ArrayList<>();
private int i = 0;
public SlideViewHolder(@NonNull View itemView) {
super(itemView);
linearLayout = itemView.findViewById(R.id.llout_slidescreenId);
}
}
发生这种情况是因为您一直在 onBindViewHolder()
中添加视图,并且从未删除过已删除的前一个视图。这背后的原因是 RecyclerView.Adapter
重复使用相同的视图持有者。将此写为 onBindViewHolder()
中的第一行
holder.linearLayout.removeAllViews()
注意-你应该对你的适配器代码做一些修改。
不要在运行时创建视图 因为只有 2 个视图 VideoView
和 ImageView
。将它们添加到 R.layout.layout_slidescreen
并相应地更改它们的可见性。
不要在 bind
中直接使用 BitmapFactory.decodeFile
它应该从后台线程调用。这将使您的 UI 变慢。可能使用一些 ImageLoader 库 Glide
。
我正在使用 viewpager2 创建图像和视频滑块。我为此使用了 recyclerviewadapter。我的代码如下。从文件加载到 imageview correctly.My 列表的位图有 14 个项目(图像和视频)。但是 linearlayout.addview 只显示重复的图像。显示 5 张图像后,它从 1 开始。为什么这些图像重复..请帮助..我的 recylerview 适配器 class 在下面给出..这有什么问题
public SlideViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_slidescreen, parent, false);
return new SlideViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull SlideViewHolder holder, int position) {
Log.d("CHKck", position + " " + getItemCount());
StatusModel statusModel = itemList.get(position);
File file = statusModel.getFile();
Log.d("CHKfileadapt", String.valueOf(file) + " " + position);
if (file.exists()) {
if (statusModel.isVideo) {
LinearLayout linearLayout = new LinearLayout(context);
linearLayout.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
linearLayout.setGravity(Gravity.FILL);
linearLayout.setOrientation(LinearLayout.VERTICAL);
VideoView videoView = new VideoView(context);
videoView.setVideoPath(file.getAbsolutePath());
videoView.setMediaController(new MediaController(context));
holder.linearLayout.addView(videoView);
} else {
Log.d("CHK", "image");
holder.linearLayout.setOrientation(LinearLayout.VERTICAL);
holder.linearLayout.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
ImageView imageView = new ImageView(context);
Bitmap bitmap = BitmapFactory.decodeFile(statusModel.getPath());
imageView.setImageBitmap(bitmap);
imageView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
holder.linearLayout.addView(imageView);
}
}
}
@Override
public int getItemCount() {
return itemList.size();
}
public class SlideViewHolder extends RecyclerView.ViewHolder {
private LinearLayout linearLayout;
private List<Integer> poslist = new ArrayList<>();
private int i = 0;
public SlideViewHolder(@NonNull View itemView) {
super(itemView);
linearLayout = itemView.findViewById(R.id.llout_slidescreenId);
}
}
发生这种情况是因为您一直在 onBindViewHolder()
中添加视图,并且从未删除过已删除的前一个视图。这背后的原因是 RecyclerView.Adapter
重复使用相同的视图持有者。将此写为 onBindViewHolder()
holder.linearLayout.removeAllViews()
注意-你应该对你的适配器代码做一些修改。
不要在运行时创建视图 因为只有 2 个视图
VideoView
和ImageView
。将它们添加到R.layout.layout_slidescreen
并相应地更改它们的可见性。不要在
bind
中直接使用BitmapFactory.decodeFile
它应该从后台线程调用。这将使您的 UI 变慢。可能使用一些 ImageLoader 库Glide
。