ViewrAdapter中的instantiateItem(ViewGroup,int)和ViewPager中的AddView混淆

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也回来了.

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

  • 只是对新版本的修复...使用带有ViewGroup的instantiateItem而不是View ...它已在上一版本中折旧. (5认同)

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.在向后滑动时获得.

ViewPager内存