Android 如何在ListView中维护ViewPager的状态?

Android 如何在ListView中维护ViewPager的状态?,android,android-listview,android-viewpager,Android,Android Listview,Android Viewpager,我想实现一个viewpager列表。ListView的每个项目都是ViewPager。到目前为止,这是可行的。我的问题是,我无法保持ViewPager的状态。例如:当我更改列表中第一个ViewPager的页面时,向下滚动直到第一个ViewPager不再可见,然后再次向上滚动,第一个ViewPager将再次显示其第一页 我编写了两个适配器,一个用于ListView,另一个用于ViewPager。我正在尝试从ListAdapter中getView方法的convertView参数中回收视图。不确定我是

我想实现一个viewpager列表。ListView的每个项目都是ViewPager。到目前为止,这是可行的。我的问题是,我无法保持ViewPager的状态。例如:当我更改列表中第一个ViewPager的页面时,向下滚动直到第一个ViewPager不再可见,然后再次向上滚动,第一个ViewPager将再次显示其第一页

我编写了两个适配器,一个用于ListView,另一个用于ViewPager。我正在尝试从ListAdapter中getView方法的convertView参数中回收视图。不确定我是否做得对,也不知道如何在ViewPagerAdapter中做

有什么想法吗

以下是我目前的代码:

从MyListAdapter获取视图:

@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实例化项:

@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;
}

谢谢!:)

您可以感谢ListView回收是导致此问题的原因。 它有助于执行回收者回收您的行项目并重新使用它

一个解决问题的简单方法是使用标签。在返回rowView之前设置标记

view.setTag(currentPagerPosition);
那么如果convertView!=null您知道您必须已设置位置,以便可以执行此操作

int pastPagerPosition = (int) view.getTag();

实现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             
        }
    });

希望这有帮助

当寻呼机从第一页移动到下一页时,您需要找到当前位置?ViewPagerAdapter中应该有一个getPosition()函数或类似的函数。谢谢您,Frank。我已经考虑过类似的解决方案,但我的问题是从MyListViewAdapter内部获取当前的ViewPager位置。有一个名为getCurrentItem()的方法应该执行此操作,但我总是返回“0”。(我在getView方法中的ViewPager对象上使用它)哼哼。在重写getCurrentItem()时,我遇到了与ListView类似的错误,问题的根源是没有正确处理不同类型的视图。最后,我找到了如何将.getTag()与PageChangeListener一起使用的方法。谢谢你的提示!获取ViewPager的当前位置是这样工作的,谢谢Kalai!