我创建了一个自定义类,将PagerAdapter
代表我的适配器代表ViewPager
,我在其中滑过Views
( 不是碎片 < /强>)。
我的问题是,我不知道如何获取我之前添加到适配器的当前View,以便我可以使用它来执行某个过程。
PagerAdapter
仅提供返回instantiateItem(ViewGroup container, int position)
的{{1}}方法,并且在我的实现中,它返回Object
。
这是调用以获取当前位置的View
的正确方法吗?如果是,我作为View
参数传递了什么?
提前谢谢!
参考文献:
SequenceAdapter.java
container
答案 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()
以清除标记为已更改的位置。