Адаптер Viewpager создается всегда в Recyclerview Adapter - PullRequest
1 голос
/ 20 апреля 2020

У меня есть ViewPager внутри RecyclerView Adapter для отображения нескольких изображений. Код адаптера 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;
}

Проблема: когда я прокручиваю вверх и вверх RecyclerView, адаптер ViewPager создается снова и снова, даже если он создается до (я вижу это в журнале). Я знаю, что onBindViewHolder () вызывается каждый раз, поэтому я попробовал это:

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

Но на этот раз загружается только первый ViewPager. Так что я должен делать, чтобы не создавать адаптер каждый раз?

1 Ответ

0 голосов
/ 20 апреля 2020

Похоже, вы пытаетесь использовать тот же адаптер для каждого элемента, что и глобальное поле, попробуйте сделать адаптер элементом поля для каждого класса держателя вида, например:

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

             }



            .........

        }
    }
  }
...