我想实现一个ViewPagers列表。 ListView的每个项目都是ViewPager。这项工作到目前为止。我的问题是,我无法维持ViewPager的状态。例如:当我更改列表中第一个ViewPager的页面时,向下滚动直到第一个ViewPager不再可见,然后再次向上滚动,第一个ViewPager再次显示其第一页。
我写了两个适配器,一个用于ListView,另一个用于ViewPager。我正在尝试从ListAdapter中的getView方法的convertView参数回收视图。不确定我是否做得对,不知道如何在ViewPagerAdapter中做到这一点。
有什么想法吗?
到目前为止,这是我的代码:
来自MyListAdapter的getView:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null){
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mRowView = inflater.inflate(R.layout.listitem, parent, false);
}else{
mRowView=convertView;
}
switch(position){
case 0://Fussball
ViewPagerAdapter fussballAdapter = new ViewPagerAdapter(mContext,"Fussball");
ViewPager fussballPager = (ViewPager) mRowView.findViewById(R.id.viewpager1);
fussballPager.setAdapter(fussballAdapter);
break;
case 1://Handball
ViewPagerAdapter handballAdapter = new ViewPagerAdapter(mContext,"Handball");
ViewPager handballPager = (ViewPager) mRowView.findViewById(R.id.viewpager1);
handballPager.setAdapter(handballAdapter);
break;
//.../
default:
//Do nothing
}
return mRowView;
}
来自ViewPagerAdapter的instantiateItem:
@Override
public Object instantiateItem(View pager, int position) {
inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
switch(position){
case 0:
oneLayout=inflater.inflate(R.layout.table_layout, null);
break;
case 1:
oneLayout=inflater.inflate(R.layout.table_layout_second, null);
break;
default:
oneLayout=inflater.inflate(R.layout.table_layout, null);
break;
}
((ViewPager)pager).addView( oneLayout, 0 );
return oneLayout;
}
谢谢! :)
答案 0 :(得分:4)
实现setOnPageChangeListener并且您可以在此处获取当前位置
pager = (ViewPager) findViewById(R.id.pager);
pager.setAdapter(new ImagePagerAdapter(imageUrls));
pager.setCurrentItem(position);
pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
int i = 0;
int newpos = arg0;
}
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
int i = 0;
int newpos = arg0;
}
public void onPageSelected(int arg0) {
// TODO Auto-generated method stub
int i = 0;
position = arg0;
//you can get Current position here
}
});
希望这有助于!!!
答案 1 :(得分:1)
您可以感谢ListView Recycling是导致此问题的原因。 它有助于执行回收器回收您的行项目并重复使用它。
一个可以解决问题的简单方法是使用标记。在返回rowView之前设置标记。
view.setTag(currentPagerPosition);
然后,如果convertView!= null,你知道你必须设置位置,这样你才能做到
int pastPagerPosition = (int) view.getTag();