gpt4 book ai didi

android - Viewpager 没有得到最后一项

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:34:49 27 4
gpt4 key购买 nike

我在我的应用中使用了两个 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;
}
}

默认情况下,当我运行应用程序时,它显示如下,在第二个寻呼机中它不显示产品价格,

enter image description here

但是当我滚动图片时它显示价格

enter image description here

我的预期输出是

enter image description here

这是我的 json 响应

http://pastebin.com/fbJang2B

最佳答案

首先,正如@NotobharatKumar 所提到的,您在父适配器的错误事件中加载第二个适配器,即在 onPageScrolled 方法中。其次,您每次都在该特定事件上设置一个新的适配器,这似乎没有用。最后,您要在事件中设置数据,(我不确定您为什么这样做但是)我更愿意将其设置在单独的适配器中并让事件监听器进行特定行为.

对我来说,您似乎有两个单独的 适配器,但一个数据列表 由两者共享。假设,您必须在开始时分别设置它们的数据,并且在顶部适配器的事件 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());
...
}

最后,使用第一个的onPageSelected事件控制底部的ViewPager:

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

希望这会有所帮助。

关于android - Viewpager 没有得到最后一项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41217237/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com