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

Solutions Collecting From Web of "PagePadapter中的InstantiateItem和ViewPager中的AddView混淆"

我最近实现了这一点,这是我的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内存