我试图在不使用Fragments的情况下实现ViewPager。让我们说,我有一个非特定数量的数据存储在某种数据库中,映射到特定的日期。我想要做的是在ViewPager页面上显示特定日期的数据。
这就是我目前正在做的事情:
@Override
protected void onCreate(Bundle savedInstanceState) {
dataList = (ViewPager) findViewById(R.id.dataList);
dataList.setAdapter(new DataListSlidePagerAdapter());
dataList.setCurrentItem(Integer.MAX_VALUE / 2);
}
private class DataListSlidePagerAdapter extends PagerAdapter {
int lastPosition;
@Override
public Object instantiateItem(ViewGroup collection, int position) {
if (position > lastPosition) {
GregorianCalendar today = Settings.getCurrentDay();
today.add(GregorianCalendar.DATE, 1);
Settings.loadData();
}
else if (position < lastPosition) {
GregorianCalendar today = Settings.getCurrentDay();
today.add(GregorianCalendar.DATE, -1);
Settings.loadData();
}
lastPosition = position;
LinearLayout v = createDataList(Settings.getTodaysData());
collection.addView(v);
return v;
}
@Override
public void destroyItem(ViewGroup collection, int position, Object view) {
((ViewPager) collection).removeView((LinearLayout) view);
}
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == ((View) arg1);
}
public int getItemPosition(Object object) {
return POSITION_NONE;
}
}
这实际上几乎可以工作,但不幸的是,当前数据从未显示在当前页面上,而是显示在下一页或上一页上。我的猜测是,这是因为instantiateItem
不一定构建当前页面的视图,而是构建下一个可能需要显示的页面。但是,createListData()
始终会创建当天的视图。
知道如何修复此问题并在正确的页面上显示正确的数据吗?您可以假设,还有Settings.getTomorrowsData()
和Settings.getYesterdaysData()
等功能。