为什么viewpage2在列表中的5个图像之后重复显示相同的图像.为什么



我正在使用viewpager2创建一个图像和视频滑块。我用了回收器的适配器。我的代码在下面。文件中的位图已正确加载到imageview。我的列表有14项(图像和视频(。但是linearlayout.addview只显示重复的图像。在显示了5个图像之后,它从1开始。为什么这些图像在重复。。请帮忙。。下面给出了我的recylerview适配器类。。这个有什么问题

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()

注意-您应该对适配器代码进行少量修改。

  1. 不要在运行时创建视图,因为只有两个视图VideoViewImageView。在R.layout.layout_slidescreen中添加它们,并相应地更改它们的可见性。

  2. 不要在bind中直接使用BitmapFactory.decodeFile,它应该从后台线程调用。这将使您的UI滞后。也许可以使用一些ImageLoader库Glide

最新更新