Viewpager не получает последний элемент

Я использую два Viewpager в своем приложении,

1) Первый Viewpager отображает только изображения

2) Я показываю цену

теперь проблема заключается в том, что у меня есть 4 изображения, отображаемые на моем viewpager1, а во втором пейджере у меня цена по выбранному продукту. первый раз он ничего не показывает, но когда я прокручиваю изображение и перехожу к следующему, он показывает цену..

 pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

                Picasso.with(ProductLandingActivity.this)                            .load(categorylist.get(position).getProductLanding_packLink())
                        .error(R.drawable.nopreview )
                        .placeholder(R.drawable.progress_animation)
                        .into(selectedImage);

                System.out.println("Selected is"+position);
              selectedname.setText(categorylist.get(position).getProductLanding_packDesc());

                for (int i = 0; i < categorylist.get(position).getItems().size(); i++) {
                    System.out.println("ProductPack_ID : " + categorylist.get(position).getItems().get(i).getPackSize_sellingPrice());


                }

                temp = categorylist.get(position).getItems();

              packadapter = new MyPacksPagerAdapter(ProductLandingActivity.this,categorylist);
                pagerpacks.setAdapter(packadapter);

            }

            @Override
            public void onPageSelected(int position) {


            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }


        });

Адаптер

private class MyPacksPagerAdapter extends PagerAdapter {

        Context context;
        ArrayList<PackListModel> packsizedata ;

        public MyPacksPagerAdapter(Context context,ArrayList<PackListModel> packsizedata) {
            this.context = context;
            this.packsizedata = packsizedata;

        }

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

            final OneActor oneActor;

            View view;
            LayoutInflater infl = ((Activity)context).getLayoutInflater();
            view = infl.inflate(R.layout.list_item_pagerpacktitles, container,false);
            oneActor = new OneActor();
           // oneActor.avatar = (ImageView) view.findViewById(R.id.image);
            oneActor.name = (TextView) view.findViewById(R.id.product_landing_packsname);
            oneActor.cmtCount = (TextView) view.findViewById(R.id.product_landing_packsprice);
            view.setTag(oneActor);


          oneActor.name.setText(temp.get(position).getPackSize_packSize());
            oneActor.cmtCount.setText(temp.get(position).getPackSize_sellingPrice());

            ((ViewGroup) container).addView(view);
            return view;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((View)object);
        }

        @Override
        public int getCount() {
            return packsizedata.size();
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {
            return (view == object);
        }
        class OneActor{
           // ImageView avatar;
            TextView name,cmtCount;
        }
    }

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

введите описание изображения здесь

Но когда я прокручиваю изображение, он показывает цену

введите описание изображения здесь

Мой ожидаемый результат

введите описание изображения здесь

Это мой ответ json

http://pastebin.com/fbJang2B

Ответ 1

Во-первых, как упоминалось @NotobharatKumar, вы загружаете второй адаптер в неправильное событие родительского адаптера, то есть в метод onPageScrolled. Во-вторых, вы устанавливаете новый адаптер каждый раз на этом конкретном событии, это кажется бесполезным. Наконец, вы устанавливаете данные в событии (я не уверен, почему вы это делаете, но) Я бы предпочел установить его в отдельном адаптере и позволить слушателям прослушивать конкретные поведения.

Для меня кажется, что у вас есть два адаптера отдельно, но один список datas, совместно используемый обоими. Предполагая, что вы должны установить их как в начале с их данными, так и в событии onPageSelected верхнего адаптера, вам просто нужно автоматически прокрутить второй. И если они имеют одинаковую позицию в списке, onPageSelected должен правильно выполнить работу.


Итак, эти изменения должны решить вашу проблему:

Ваш код в onScrollChanged, когда вы устанавливаете изображение и текст, кажется мне очень странным. Я бы использовал первый адаптер, где я установил все данные, подобные этим двум, для первого ViewPager:

@Override
public void onCreate(Bundle savedInstansteState) {
    ...
    // set a simple adapter for the first ViewPager
    FirstPagerAdapter imageadapter = 
             new FirstPagerAdapter(ProductLandingActivity.this, categorylist);
    pagerimages.setAdapter(imageadapter);
    ...
}

Затем, как обычно, установите ваши данные в FirstPagerAdapter:

@Override
public View getView(int position, View view, ViewGroup container) {
    ...
    // set the content
    Picasso.with(ProductLandingActivity.this)                            
        .load(categorylist.get(position).getProductLanding_packLink())
        .error(R.drawable.nopreview )
        .placeholder(R.drawable.progress_animation)
        .into(selectedImage);

    selectedname.setText(
            categorylist.get(position).getProductLanding_packDesc());
    ...
}

Тогда нет необходимости (повторно) загружать изображение или текст при срабатывании события, так как они будут удерживаться адаптером.

Во втором адаптере вы используете только getPackSize_packSize() и getPackSize_sellingPrice(), поэтому вы должны создать отдельный список, который будет заполняться только этими данными, но вне события проверки. Начните с инициализации второго списка и адаптеров:

// get the Items to fill the pack items list (like you did for `temp`)
ArrayList<Items> packItems = new ArrayList<>();
for (int i = 0; i < categorylist.size(); i++) {
    packItems.add(categorylist.get(position).getItems());
}

// fill the first adapter with your list of products (ie categorylist)
...
pagerimages.setAdapter(imageadapter);
...
// fill the second adapter with the pack items list
packadapter = new MyPacksPagerAdapter(ProductLandingActivity.this, packItems);
pagerpacks.setAdapter(packadapter);

Вы должны сделать это, когда categorylist создан и заселен. Поэтому разместите этот выше код, например, в своем обратном вызове, когда вы извлекаете данные с вашего сервера.

Так как второй список packItems заполняется в том же порядке, что и categorylist, не будет странного поведения, изменив обе позиции. Теперь во втором адаптере предпочтительнее использовать локальный список packsizedata, как показано ниже:

@Override
public Object instantiateItem(ViewGroup container, int position) {
    ...
    oneActor.name.setText(
            packsizedata.get(position).getPackSize_packSize());
    oneActor.cmtCount.setText(
            packsizedata.get(position).getPackSize_sellingPrice());
    ...
}

Наконец, управляйте нижним ViewPager с помощью события onPageSelected первого:

pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    @Override
    public void onPageScrolled(int position, float positionOffset, 
                            int positionOffsetPixels) { }

    @Override
    public void onPageSelected(int position) {
        // set the second current page regarding the position of the first
        pagerpacks.setCurrentItem(position);
    }

    @Override
    public void onPageScrollStateChanged(int state) { }
});

Надеюсь, это будет полезно.

Ответ 2

Вы должны реализовать код для действия с помощью метода onPageSelected, потому что после изменения страницы вашего ViewPager будет вызываться onPageSelected.