我在我的应用中使用了两个Viewpager
,
1)首先Viewpager
仅显示图像
2)我正在显示价格
现在问题是我在viewpager1中显示了4个图像,在第二个寻呼机中我根据所选产品定价。第一次它没有显示任何东西,但当我滚动图像并转到下一个,它显示价格..
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;
}
}
当我运行应用程序时defaulat它显示这样,在第二个寻呼机它没有显示产品价格,
但是当我滚动图片时它会显示价格
我的预期输出
这是我的json回复
答案 0 :(得分:4)
首先,正如@NotobharatKumar所提到的,你是在父适配器的错误事件上加载第二个适配器,即在Connection
方法中。其次,你每次在特定事件上设置一个新的适配器,它似乎没用。最后,你在一个事件中设置数据,(我不知道为什么你这样做但是)我更喜欢将它设置在一个单独的适配器中,让事件监听器用于特定的行为
对我来说,您似乎有两个单独的适配器,但两者共享一个数据列表。假设你必须在开始时设置它们的数据,并且在顶部适配器的事件onPageScrolled
上,你只需要自动滚动第二个。如果它们在列表中具有相同的位置,onPageSelected
应该正确地完成工作。
因此,这些修改应该可以解决您的问题:
当您设置图像和文本时,onPageSelected
中的代码对我来说似乎很奇怪。我将使用第一个适配器,我将为第一个onScrollChanged
设置所有这两个数据:
ViewPager
然后,像往常一样,在FirstPagerAdapter中设置数据:
@Override
public void onCreate(Bundle savedInstansteState) {
...
// set a simple adapter for the first ViewPager
FirstPagerAdapter imageadapter =
new FirstPagerAdapter(ProductLandingActivity.this, categorylist);
pagerimages.setAdapter(imageadapter);
...
}
然后在触发事件时不需要(重新)加载图像或文本,因为它们将由适配器保持。
您只在第二个适配器中使用@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()
您必须在创建并填充<{1}}时执行此操作。因此,当您从服务器检索数据时,请将此代码置于回调中。
由于第二个列表// 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
希望这会有所帮助。
答案 1 :(得分:2)
您应该使用onPageSelected
方法实施操作代码,因为在您更改ViewPager
页面后,将调用onPageSelected
。