当前位置: 首页 > 知识库问答 >
问题:

每次都会在Recyclerview Adapter中创建Viewpager适配器

何浩荡
2023-03-14

我有一个ViewPager里面的RecyclerView适配器来显示多个图像。

 @Override
public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, final int position) {

   Call<List<ImagesModel>> call = restApiClass.getPostImages(list.get(position).getId());
    call.enqueue(new Callback<List<ImagesModel>>() {
        @Override
        public void onResponse(Call<List<ImagesModel>> call, Response<List<ImagesModel>> response) {

            if (response.isSuccessful() && response.body() != null) {

                imagesList = response.body();

                viewPagerAdapter = new ViewPagerAdapter (imagesList, context);
                Log.i("adapterPosts", "A NEW ADAPTER IS CREATED");

                holder.postsViewPager.setAdapter(viewPagerAdapter );
                holder.postsCircleIndicator.setViewPager(holder.postsViewPager);

            }
        }
}

ViewPager适配器:

@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {

   //...defination codes...//
    progressBar .setVisibility(View.VISIBLE);

    Glide.with(context).load(ApiClient.Base_URL + list.get(position).getImage())
            .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
            .dontAnimate()
            .dontTransform()
            .fitCenter()
            .listener(new RequestListener<Drawable>() {
                @Override
                public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                    progressBar .setVisibility(View.GONE);
                    return false;
                }

                @Override
                public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                    progressBar .setVisibility(View.GONE);
                    return false;
                }
            })
            .into(photoView);

    container.addView(view);
    return view;
}

问题:当我上下滚动回收站视图时,ViewPager适配器会被一遍又一遍地创建,即使它是以前创建的(我在日志中看到它)。我知道每次都调用onBindViewHolder(),所以我尝试了这个:

    if(viewPagerAdapter ==null){
                viewPagerAdapter = new ViewPagerAdapter(imagesList, context);
                holder.postsViewPager.setAdapter(viewPagerAdapter);
             holder.postsCircleIndicator.setViewPager(holder.postsViewPager);
    } else {
     viewPagerAdapter.notifyDataSetChanced();
    }

但这一次只加载了第一个ViewPager。那么,我必须做些什么来避免每次创建适配器呢?

共有1个答案

包嘉懿
2023-03-14

看,似乎您试图对每个项目使用相同的适配器作为全局字段,尝试使适配器成为每个视图持有者类的成员字段,如下所示:

public static class YourViewHolder extends RecyclerView.ViewHolder {
    ............
    private ViewPagerAdapter adapter;
    ..........

    public YourViewHolder(View v) {
        super(v);

        ................



    }

在onBindViewHolder中:

  @Override
  public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, final int position) {

          .....................

        if (response.isSuccessful() && response.body() != null) {

            ...........

            imagesList = response.body();

            //create the adapter per viewholder if not exists
            if(holder.adapter==null){

            //create adapter
            holder.adapter = new ViewPagerAdapter (imagesList, context);

            //set adapter
            holder.postsViewPager.setAdapter(holder.adapter);

             }



            .........

        }
    }
  }
 类似资料:
  • 适配器目录和文件结构 适配器目录和文件结构布局的例子: /application/libraries/Driver_name Driver_name.php drivers Driver_name_subclass_1.php Driver_name_subclass_2.php Driver_name_subclass_3.php 注意: 为了在大小写敏感的文件系统上维持兼容性,这个 Drive

  • 我已经用ImageView和TextView制作了抽屉菜单,它可以run.However,当我想用两个ImageView和一个TextView创建抽屉菜单时,它会用我的第二个ImageView显示错误(“尝试调用虚拟方法”)(我代码中的变量名称是“img”) 我的代码如下: 这是我的日志: 09-16 22:25:38.458:E/AndroidRuntime(14966):致命例外:主 09-1

  • MainActivity(扩展了fragmentActivity)有listview,它调用listviewadapter,其中有一个带有ViewpagerAdapter的ViewPager。现在,如果我需要在ViewPager中生成5个片段,如何将getFragmentManager()传递给适配器。 MainActivity[fragmentActivity]---->Listview----

  • 问题内容: 我正在使用 PhoneGap 开发移动应用程序,并且必须 从另一个项目 访问某些 服务 。我正在使用 jquery-2.0.0.js 和 jquery-mobile-1.3.2.js 。 这个ajax调用每次都会失败。在 config.xml中, 我有以下几行: 我可能在哪里错了! 问题答案: 问题在于您的phonegap应用程序正在从非网络服务器请求本地文件。本地文件交付时没有HTT

  • 问题内容: 我有一个CI管道来构建我的android应用程序,并使用gitlab管道运行有条件的测试。我的gitlabRunner是一台ubuntu 16.04机器,在docker容器中运行每个构建。我有一个通过USB连接到gitlab运行程序的物理android设备。 最近,每次触发新的构建时,系统都会提示我允许android目标上的USB设备使用RSA指纹。问题在于指纹随着每个构建而变化。 我

  • 问题内容: 我有一些碎片。每个片段具有在(=挥动之前不可见的)用。 适配器设置为,这会减慢刷卡速度,因为每次创建时都要载入30个列表项,因为正在创建新的片段。 我的问题是,在空闲时刷卡后是否可以设置适配器?或者,还有更好的方法?扩展SlideDrawer时,该列表需要已经加载。 问题答案: 我的问题是,是否可以在Pager闲置时刷卡后设置适配器? 还有就是,你可以在设置监控的滑动手势。然后,您可以