如何从某个位置获取PagerAdapter的当前视图?

时间:2016-09-07 19:48:48

标签: android android-viewpager android-pageradapter

我创建了一个自定义类,将PagerAdapter代表我的适配器代表ViewPager,我在其中滑过Views 不是碎片 < /强>)。

我的问题是,我不知道如何获取我之前添加到适配器的当前View,以便我可以使用它来执行某个过程。

PagerAdapter仅提供返回instantiateItem(ViewGroup container, int position)的{​​{1}}方法,并且在我的实现中,它返回Object

这是调用以获取当前位置的View的正确方法吗?如果,我作为View参数传递了什么?

提前谢谢!

参考文献:

SequenceAdapter.java

container

1 个答案:

答案 0 :(得分:1)

您的PagerAdapter子类正在为ViewPager所需的视图建模,因此与ListView类似,您可以在适配器上调用notifyDataSetChanged()

在这里,它变得奇怪:ViewPager然后会问你的适配器所有当前页面的去向。这是通过覆盖getItemPosition()来处理的。返回POSITION_NONE将告诉ViewPager该页面上的视图索引不再有效,之后它将调用instantiateItem()以获取更新的视图。

因此,不要试图获取已经实例化的视图(如果用户已经远离它几页,可能甚至不存在),只需告诉ViewPager该视图不是有效的。再把它交给更新的视图。

您可以使用适配器执行以下操作:

public class SequenceAdapter extends PagerAdapter {

    private List<View> mList;

    /** List of all the views/positions that have changed since last update */
    private List<Integer> mChanged;

    public SequenceAdapter(){
        this.mList = new ArrayList<>();
        this.mChanged = new ArrayList<>();
    }

    public void add(View viewGroup){
        mList.add(mList.size(), viewGroup);
        notifyDataSetChanged();
    }

    public View get(int position) {
        return mList.get(position);
    }

    public void update(View view, int position) {
        mList.set(position, view);
        mChanged.add(position);
        notifyDataSetChanged();
    }

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

    @Override
    public boolean isViewFromObject(View view, Object object) {
        int position = (Integer) object;
        return view == mList.get(position);
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        View view = mList.get(position);
        container.addView(view, position);
        return new Integer(position);
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return null;
    }

    @Override
    public int getItemPosition(Object object) {
        int position = (Integer) object;
        return mChanged.contains(position) ? POSITION_NONE : position;
    }

    @Override
    public void finishUpdate(ViewGroup container) {
        mChanged.clear();
    }

}

请注意,我将您的引用对象更改为具有视图位置的Integer,而不是视图本身。这使事情变得容易一些。

使用get()方法,您可以访问该视图,然后使用update()进行更新。更新视图后,如果当前位于ViewPager,您应该会看到getItemPosition()被调用。如果返回POSITION_NONE,您应该instantiateItem()调用该位置。由于ViewPager通过多次调用适配器进行更新的方式,它必须告诉您何时完成,因此您覆盖finishUpdate()以清除标记为已更改的位置。