我需要显示一个ViewPager,它最初只显示一个View。
一旦该视图通过了度量和布局传递,根据这些结果,我可能需要更改适配器的内容。
这样做的时候,我遇到了一个场景,当试图从某个位置滑动到下一个项目时,ViewPager不会跟随其移动。
我确定我在适配器实现中做错了什么,但是我无法直指这个问题。
为了演示,我创建了一个虚拟适配器,该适配器将模仿实际项目中发生的情况。
为了重现该问题,只需尝试一直滑动到位置2(第三项),结果是您无法越过位置1(第二项)。
谢谢!
public class CustomAdapter extends PagerAdapter {
int pages = 0;
@Override
public int getCount() {
return pages;
}
@Override
public boolean isViewFromObject(View view, Object o) {
return view == o;
}
public void setPages(int x) {
this.pages = x;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
TextView tv = new TextView(MainActivity.this);
ViewGroup.LayoutParams lp =
new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
tv.setLayoutParams(lp);
tv.setText("Position: " + position);
if (position == 0 && pages == 1) {
setPages(2);
notifyDataSetChanged();
}
if (position == 1 && pages == 2) {
setPages(3);
notifyDataSetChanged();
}
container.addView(tv);
return tv;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
}
活动(onCreate左右):
CustomAdapter adapter = new CustomAdapter();
adapter.setPages(1);
vp.setAdapter(adapter);
adapter.notifyDataSetChanged();
最佳答案
InstantiateItem项方法在错误的位置进行。因为它仅对一个视图不起作用,所以它同时对3个视图起作用。
尝试移动
if (position == 0 && pages == 1) {
setPages(2);
notifyDataSetChanged();
}
if (position == 1 && pages == 2) {
setPages(3);
notifyDataSetChanged();
}
在
setPrimaryItem
方法更新:
尝试为
instantiateItem
方法中所需的位置调用setPrimaryItem
方法。您可以这样做,因为instantiateItem
是public
方法。但是我不知道它是如何工作的,这是一种理论。试一试。