为什么 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()

注意-你应该对你的适配器代码做一些修改。

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

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