【问题标题】:How to maintain the state of ViewPager in a ListView?ListView如何维护ViewPager的状态?
【发布时间】:2012-06-12 13:14:30
【问题描述】:

我想实现一个 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;
}

谢谢! :)

【问题讨论】:

    标签: android android-listview android-viewpager


    【解决方案1】:

    实现 setOnPageChangeListener 并且您可以在此处获取当前位置 onpageselected

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

    希望对你有帮助!!!

    【讨论】:

    • 以这种方式获取 ViewPager 的当前位置,感谢 Kalai!
    【解决方案2】:

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

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

    view.setTag(currentPagerPosition);
    

    那么如果 convertView != null 你知道你必须已经设置了位置,所以你可以这样做

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

    【讨论】:

    • 从第一页移动到下一页需要找到当前位置吗?
    • ViewPagerAdapter 应该有一个 getPosition() 函数或类似的函数。
    • 谢谢你,弗兰克。我已经考虑过类似的解决方案,但我的问题是从 MyListViewAdapter 中获取当前 ViewPager 位置。有一个名为 getCurrentItem() 的方法应该这样做,但我总是得到“0”。 (我在getView方法里面的ViewPager对象上使用)
    • 嗯。您是否覆盖了 getCurrentItem(),我遇到了与 ListViews 类似的错误,问题的根源是没有正确处理不同类型的 Views。
    • 终于想通了,如何使用.getTag() 和PageChangeListener。谢谢你的提示!
    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 2019-09-06
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    • 2014-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多