PagePadapter中的InstantiateItem和ViewPager中的AddView混淆

到目前为止,我一直在黑客一起使用示例来感受整个Anfroid SDK的API。 但是我陷入了僵局。

我想从一个XML文件中使用2个TextViews对一个LinearLayout进行充气。 这些将是分页视图。 我只是无能为力,并意识到我完全不明白代码中发生了什么。

看看源代码,我可以看到ViewPager.addNewItem方法从提供的适配器调用InstantiateItem。 并且在populate()中调用addNewItem。 填充在其他地方被调用。

无论如何,在我已经看到的方法被重载的PagerAdapter的例子中,你必须包括一个调用AddView的ViewPager收集从viewpager作为parameter passing。

如果我想添加多个视图,我认为这将是不止一次调用addView的情况,但作为instantiateItem返回一个Object到ViewPager(在这个例子中,我有它返回的视图,它添加),我不知道该怎么回报。 我已经尝试返回充气的视图和一些其他的东西。

请有人可以解释这里发生了什么?

非常感激。

中号

@Override public Object instantiateItem(View collection, int position) { layout = inflater.inflate(R.layout.animallayout, null); TextView tv = (TextView) layout.findViewById(R.id.textView1); tv.setText("1________________>" + position); TextView tv2 = (TextView) layout.findViewById(R.id.textView2); tv.setText("2________________>" + position); ((ViewPager) collection).addView(layout); return layout; } 

  • Android PagerAdapter,获取当前位置
  • 嵌套Android ViewPager,在ListView中水平滑动ListItems
  • Viewpager碎片在第一次之后不显示
  • 平滑滚动在ViewPager(支持库)中不起作用
  • TabLayout的Tabs不显示
  • 屏幕方向更改后,从ViewPager的适配器中销毁项目
  • 如何使用页面滑动视图创建Android选项卡式样式
  • Viewpager在从互联网加载图像后不包装内容
  • 我最近实现了这一点,这是我的instantiateItem方法(使其可读性有点微不足道。

     @Override public Object instantiateItem(View collection, int position) { Evaluation evaluation = evaluations.get(position); View layout = inflater.inflate(R.layout.layout_evaluation, null); TextView evaluationSummary = (TextView) layout.findViewById(R.id.evaluation_summary); evaluationSummary.setText(evaluation.getEvaluationSummary()); ((ViewPager) collection).addView(layout); return layout; } @Override public void destroyItem(View collection, int position, Object view) { ((ViewPager) collection).removeView((View) view); } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } 

    因此,对于显示的页面,我使用位置作为索引从我的evaluations列表中获取数据。 然后膨胀有视图的Layout ,我也将添加我的数据。 然后我得到TextView来设置评估摘要文本。 然后将整个Layout添加到ViewPager 。 最后Layout也返回。

    如果你仍然无法发布你的代码。

    我对这个适配器的工作原理也有同样的误解,我已经做了一些调查。
    关键的特点是你的意见存储在两个地方:
    1在ViewPager中,你可以通过调用((ViewPager) container).addView(view);添加它们((ViewPager) container).addView(view); (在这里你只需要存储三个视图,你看到的和左右的邻域)
    2 private final ArrayList<ItemInfo> mItems = new ArrayList<ItemInfo>(); 这是ViewPager的成员存储与他们possition(通过调用适配器方法mAdapter.instantiateItem(this, position);这里添加的信息)

     static class ItemInfo { Object object; int position; boolean scrolling; float widthFactor; float offset; } 

    幻灯片ViewPagermItems数组获取视图位置或实例化它,并使用适配器方法将此视图与ViewPager子视图进行比较方法public boolean isViewFromObject(View view, Object object) 。 在ViewPager上向用户显示与object相等的视图。 如果没有视图,则显示空白屏幕。
    这里是视图与对象进行比较的ViewPager方法:

     ItemInfo infoForChild(View child) { for (int i=0; i<mItems.size(); i++) { ItemInfo ii = mItems.get(i); if (mAdapter.isViewFromObject(child, ii.object)) { return ii; } } return null; } 

    如果来自mItems的视图位置不在范围{currentposition -1,currentposition +1}中,那么它将被销毁:

     mItems.remove(itemIndex); mAdapter.destroyItem(this, pos, ii.object); 

    ViewPagers内存的视图1

    这是一个与destroyItem陷阱,当你滑向前冷杉名为destroyItem ,然后添加新的项目,但是当你向后滑动首先添加新项目,然后旧的销毁。 如果您尝试仅使用三个caching视图,则可能会收到IllegalStateException: The specified child already has a parent. 同时向后滑动。

    ViewPager内存