向ViewPager动态添加/删除页面

Arn*_*rty 57 android android-viewpager

我想动态地在我的视图寻呼机中添加或删除页面.那可能吗?

Cod*_*Yet 26

是.您可以动态地向ViewrAdapter添加或删除视图,并将其提供给ViewPager,并notifyDataSetChanged()从PagerAdapter 调用以向受影响的ViewPager发出有关更改的警报.但是,当您这样做时,您必须覆盖getItemPosition(Object)PagerAdapter,它会告诉他们当前显示的项目是否已更改位置.默认情况下,此功能设置为POSITION_UNCHANGED,因此如果不重写此方法,ViewPager将不会立即刷新.例如,

public class mAdapter extends PagerAdapter {
    List<View> mList;

    public void addView(View view, int index) {
        mList.add(index, view);
        notifyDataSetChanged();
    }

    public void removeView(int index) {
        mList.remove(index);
        notifyDataSetChanged();
    }

    @Override
    public int getItemPosition(Object object)) {
        if (mList.contains(object) {
            return mList.indexOf(object);
        } else {
            return POSITION_NONE;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果您只想暂时从显示中添加或删除视图,而不是从PagerAdapter的数据集添加或删除视图,请尝试使用setPrimaryItem(ViewGroup, int, Object)转到PagerAdapter数据中的特定视图以及destroyItem(ViewGroup, int, Object)从显示中删除视图.


Zso*_*agy 18

是的,由于ViewPager从PagerAdapter获取子视图,您可以在其上添加新页面/删除页面,并调用.notifyDataSetChanged()来重新加载它.

  • 在理论上你的答案是正确的..但在现实世界中..从ViewPager中删除和添加东西是一种痛苦..特别是片段.. (58认同)
  • 您应该在适配器中覆盖getItemPosition() (2认同)

小智 16

是的,代码应该是这样的:

public int addPage(View view, int position) {
        if ((position >= 0) && (position < getSize())) {
            myPagerAdapter.mListViews.add(position, view);
            myPagerAdapter.notifyDataSetChanged();
            return position;
        } else {
            return -1;
        }
    }

public View removePage(int position) {
        if ((position < 0) || (position >= getSize()) || (getSize()<=1)) {
            return null;
        } else {
            if (position == mPager.getCurrentItem()) {
                if(position == (getSize()-1)) {
                    mPager.setCurrentItem(position-1);
                } else if (position == 0){
                    mPager.setCurrentItem(1);
                }
            }
            View tempView = myPagerAdapter.mListViews.remove(position);
            myPagerAdapter.notifyDataSetChanged();
            return tempView;
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是有一个错误.如果当前项目为0,并且要删除第0页,它将不会立即刷新屏幕,我还没有找到解决方案.

  • @ tc007733,它不是一个bug,你需要覆盖的关键是getItemPosition(Object o)并返回POSITION_NONE(如果这不再有效)http://stackoverflow.com/questions/13664155/dynamically-add-and-remove - 查看到viewpager (6认同)