Viewpager获取错误的页面

时间:2015-08-18 15:31:55

标签: android android-fragments android-viewpager android-fragmentactivity android-adapter

我查看了几个这样的主题,但没有看到如何解决我的问题

我有一个resturant说..用动态的类别数量..我把所有类别放在一个列表..并从这些类别创建片段

所以我不能

案例0:fragment0 案例1:frament 1

因为我不知道我有多少类别,直到运行时

class MyPageAdapter extends FragmentStatePagerAdapter {

private List<MyFragment> fragments = new ArrayList<>();
private List<menuCat> Categories = new ArrayList<>();

public MyPageAdapter(FragmentManager fm, List<menuCat> Categories) {
    super(fm);
    this.Categories = Categories;
    for (int i = 0; i<Categories.size();i++)
    {
        fragments.add(MyFragment.newInstance(Categories.get(i)));
    }
}

@Override
public String getPageTitle(int position)
{
    return Categories.get(position).catName();
}

@Override
public MyFragment getItem(int position) {
    return this.fragments.get(position);
}

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

MyFragment.class

public class MyFragment extends Fragment {

public static final MyFragment newInstance(menuCat category)
{
    Bundle bun = new Bundle();
    bun.putString("category", category.toJson());
    MyFragment f = new MyFragment();
    f.setArguments(bun);
    return f;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_my, container, false);
    String json = getArguments().getString("category");
    menuCat category = menuCat.fromJson(json);

    System.out.println(category.catName());

    ArrayList<Card> cards = new ArrayList<Card>();

   for(menuItem item : category.getItems())
   {
       Card card = new Card(getActivity());
       // Create a CardHeader
       CardHeader header = new CardHeader(getActivity());
       // Add Header to card
       header.setTitle(item.getName());
       card.setTitle(item.getPrice());
       card.addCardHeader(header);

       CardThumbnail thumb = new CardThumbnail(getActivity());
       //thumb.setDrawableResource(listImages[i]);
       //card.addCardThumbnail(thumb);

       cards.add(card);
   }


    CardArrayAdapter mCardArrayAdapter = new CardArrayAdapter(getActivity(), cards);

    CardListView listView = (CardListView) getActivity().findViewById(R.id.myList);
    if (listView != null) {
        listView.setAdapter(mCardArrayAdapter);
    }
    return v;

}

}

这是我的适配器,我的问题是例如

如果我在第1页并且我需要第3页数据..如果我将转到第2页..它将显示第3页的数据或如果我转到第5页然后向后转到...到4它也将显示第3页的数据..我的意思是它让我像下一页的数据而不是当前的数据。

1 个答案:

答案 0 :(得分:0)

在构造函数中创建所有片段是非常差的设计,因为您正在创建对这些对象的引用,这些对象稍后将附加到Activity,但是当它们被分离时,您继续保持参考资料。最后,这会让你对内存泄漏感到很沮丧。

是否无法简单地删除fragments并将您的方法更改为以下内容:

@Override
public MyFragment getItem(int position) {
    return MyFragment.newInstance(Categories.get(position));
}

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

我不确定这会解决你所有的问题,但这是一个开始。