mAn*_*oid 22 layout android android-viewpager
到目前为止,我一直在黑客攻击示例,以便了解Android SDK作为一个整体的API.但是,我陷入了僵局.
我正在尝试使用XML文件中的2个TextView来为LinearLayout充气.这些将是分页的视图.我根本无法让这个工作,并意识到我完全不明白代码发生了什么.
查看源代码,我可以看到方法ViewPager.addNewItem从提供的适配器调用InstantiateItem.并调用addNewItem populate().populate()在许多其他地方被调用.
无论如何,在这个例子中,我经历过,当为PagerAdapter重写该方法时,必须包含addView()对ViewPager作为参数传递的ViewPager集合的调用.
如果我想添加多个视图,我认为这将是多次调用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;
}
Run Code Online (Sandbox Code Playgroud)
C0d*_*ack 57
我最近实现了这个,这是我的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;
}
Run Code Online (Sandbox Code Playgroud)
因此,对于显示的页面,我evaluations使用位置作为索引从列表中获取数据.然后给Layout那个有视图的人充气,我也会添加我的数据.然后我得到了TextView设置评估摘要文本.然后将整体Layout添加到ViewPager.最后Layout也回来了.
如果你仍然无法发布你的代码.
Rom*_*ych 16
我有同样的误解,这个适配器是如何工作的,我已经做了一些调查.
关键的特点是你的视图存储在两个地方:
1在ViewPager你通过调用添加它们((ViewPager) container).addView(view);(这里你只需要存储三个视图,你看到的和左右邻居)
2 private final ArrayList<ItemInfo> mItems = new ArrayList<ItemInfo>();这是ViewPager的成员存储有关它们的信息的视图(通过调用适配器方法添加它们mAdapter.instantiateItem(this, position);)
static class ItemInfo {
Object object;
int position;
boolean scrolling;
float widthFactor;
float offset;
}
Run Code Online (Sandbox Code Playgroud)
当您ViewPager从幻灯片获取视图位置mItems或实例化它时,并将此视图与ViewPager带适配器方法的子视图进行比较public boolean isViewFromObject(View view, Object object).object向用户显示等于的视图ViewPager.如果没有视图,则显示空白屏幕.
这是ViewPager将视图与object进行比较的方法:
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;
}
Run Code Online (Sandbox Code Playgroud)
如果来自mItems的视图位置不在范围{currentposition -1,currentposition +1}中,那么它将被销毁:
mItems.remove(itemIndex);
mAdapter.destroyItem(this, pos, ii.object);
Run Code Online (Sandbox Code Playgroud)
ViewPagers内存1的视图
它是一个陷阱,destroyItem当你向前滑动时,会调用firs destroyItem,然后添加新项目,但是当你向后滑动时,首先添加新项目,然后将旧项目销毁.如果您尝试仅使用三个缓存视图,则可以IllegalStateException: The specified child already has a parent.在向后滑动时获得.

| 归档时间: |
|
| 查看次数: |
58164 次 |
| 最近记录: |