Ответ 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) { }
});
Надеюсь, это будет полезно.