java - Android ViewPager2中如何动态添加和删除页面?

标签 java android android-recyclerview android-viewpager2

这就是我想要做的。 addNewQRCard() 是由按钮触发的 onclick 事件,用于将新图像添加到 viewpager。我必须始终将适配器设置为新项目。但为什么在我的例子中 onStart() 不能完成这项工作。请给我从 viewPager2 动态添加和删除 View 的最佳实践。

public class AddPage extends AppCompatActivity {

    private ViewPager2 viewPager2;
    private ArrayList<ModelItem> items;
    private AdapterSlider adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_qrcode);

        viewPager2 = findViewById(R.id.viewPagerImageSlider);

        items = new ArrayList<>();
        items.add(new ModelItem(R.drawable.image1));


        adapter = new AdapterSlider(items,viewPager2);

        viewPager2.setAdapter(adapter);

        viewPager2.setClipToPadding(false);
        viewPager2.setClipChildren(false);
        viewPager2.setOffscreenPageLimit(3);
        viewPager2.getChildAt(0).setOverScrollMode(RecyclerView.OVER_SCROLL_NEVER);

        CompositePageTransformer compositePageTransformer = new CompositePageTransformer();
        compositePageTransformer.addTransformer(new MarginPageTransformer(40));
        compositePageTransformer.addTransformer(new ViewPager2.PageTransformer() {
            @Override
            public void transformPage(@NonNull View page, float position) {
                float r = 1 - Math.abs(position);
                page.setScaleY(0.85f + r * 0.15f);
            }
        });

        viewPager2.setPageTransformer(compositePageTransformer);
    }

    @Override
    protected void onStart() {
        super.onStart();
        adapter = new AdapterQRSlider(sliderItems,viewPager2);

        viewPager2.setAdapter(adapter);
    }

    public void addNewQRCard(View view) {   //this is the button which i used to add new childs
        items.add(new ModelSlider(R.drawable.image2));

        adapter = new AdapterSlider(items,viewPager2);

        viewPager2.setAdapter(adapter);
    }
}

适配器类

public class AdapterSliderextends RecyclerView.Adapter<AdapterSlider.ViewHolder>{

    private ArrayList<ModelSlider> items;
    private ViewPager2 viewPager2;

    public AdapterSlider(ArrayList<ModelSlider> items, ViewPager2 viewPager2) {
        this.items= items;
        this.viewPager2 = viewPager2;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return new ViewHolder(
                LayoutInflater.from(parent.getContext()).inflate(
                        R.layout.slide_item_container,
                        parent,
                        false
                )
        );
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        holder.setImage(items.get(position));
    }

    @Override
    public int getItemCount() {
        return items.size();
    }

    class ViewHolder extends RecyclerView.ViewHolder{

        private ImageView imageView;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            imageView = itemView.findViewById(R.id.imageSlide);
        }

        void setImage(ModelSlider items){
            imageView.setImageResource(sliderItem.getImage());
        }
    }
}

模型类

public class ModelSlider {

    private int image;

    public ModelSlider(int image){
        this.image = image;
    }

    public int getImage() {
        return image;
    }
}

最佳答案

您可以在添加新项目时通知适配器,就像使用 RecyclerView 所做的那样。像这样的事情

public void addNewQRCard(View view) {
    items.add(new ModelSlider(R.drawable.image2));
    // instead of of resetting adapter to ViewPager,
    // just notify its adapter of item inserted
    adapter.notifyItemInserted(items.size - 1)
}

关于java - Android ViewPager2中如何动态添加和删除页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61736940/

相关文章:

java.lang.ClassCastException : android. widget.RelativeLayout$LayoutParams 无法转换为 android.support.v7.widget.RecyclerView$LayoutParams

java - 为什么 'Path.startsWith' 行为不同于 'String.startsWith' 操作 - 即使是 'Path.getFilename'

java - 更有效/更快地执行 ImageIcon 缩放的方法?

java - 为什么我的 UI 在浏览器中运行与在我的计算机 (Java Swing) 上运行时会丢失格式?

java - NoClassDefFound错误: Failed resolution of: DataBinderMapper

java - 如何在 Android Studio 中从没有字符串 Id 的解析 JSON 中获取字符串

java - 如何检查我的 RecyclerView 适配器中的每个值?

java - 如何在循环打印的消息中放入不同的文本

android - 自己的安卓二维码扫描器应用程序

java - 如何使用适配器位置将数据从 firebase 检索到新 Activity