dynamic添加/删除页面到ViewPager

我想dynamic地添加或删除从我的查看传呼机页面。 那可能吗?

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

是。 您可以dynamic添加或删除视图到PagerAdapter,它将ViewPager提供给ViewPager,并从PagerAdapter中调用notifyDataSetChanged()来通知受影响的ViewPager有关更改。 但是,当您这样做时,您必须重写getItemPosition(Object) ,告诉它们当前显示的项目是否已更改位置。 默认情况下,这个函数被设置为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((View) object) { return mList.indexOf((View) object); } else { return POSITION_NONE; } } } 

虽然,如果您只是简单地从显示中添加或删除视图,而不是从PagerAdapter的数据集中删除视图,请尝试使用setPrimaryItem(ViewGroup, int, Object)转到PagerAdapter的数据和destroyItem(ViewGroup, int, Object)用于从显示中删除视图。

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

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

但有一个错误。 如果当前项目为0,并删除页面0,它不会立即刷新屏幕,我还没有find一个解决scheme。

我相信你已经通过扩展PageAdapter创build了一个适配器,所以有一个方法:

  @Override public void destroyItem(View collection, int position, Object view) { ((ViewPager) collection).removeView((View) view); } 

有关相同的详细示例,请通过此示例 。

这是这个问题的另一种解决scheme。 我的适配器:

 private class PagerAdapter extends FragmentPagerAdapter implements ViewPager.OnPageChangeListener, TabListener { private List<Fragment> mFragments = new ArrayList<Fragment>(); private ViewPager mPager; private ActionBar mActionBar; private Fragment mPrimaryItem; public PagerAdapter(FragmentManager fm, ViewPager vp, ActionBar ab) { super(fm); mPager = vp; mPager.setAdapter(this); mPager.setOnPageChangeListener(this); mActionBar = ab; } public void addTab(PartListFragment frag) { mFragments.add(frag); mActionBar.addTab(mActionBar.newTab().setTabListener(this). setText(frag.getPartCategory())); } @Override public Fragment getItem(int position) { return mFragments.get(position); } @Override public int getCount() { return mFragments.size(); } /** (non-Javadoc) * @see android.support.v4.app.FragmentStatePagerAdapter#setPrimaryItem(android.view.ViewGroup, int, java.lang.Object) */ @Override public void setPrimaryItem(ViewGroup container, int position, Object object) { super.setPrimaryItem(container, position, object); mPrimaryItem = (Fragment) object; } /** (non-Javadoc) * @see android.support.v4.view.PagerAdapter#getItemPosition(java.lang.Object) */ @Override public int getItemPosition(Object object) { if (object == mPrimaryItem) { return POSITION_UNCHANGED; } return POSITION_NONE; } @Override public void onTabSelected(Tab tab, FragmentTransaction ft) { mPager.setCurrentItem(tab.getPosition()); } @Override public void onTabUnselected(Tab tab, FragmentTransaction ft) { } @Override public void onTabReselected(Tab tab, FragmentTransaction ft) { } @Override public void onPageScrollStateChanged(int arg0) { } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageSelected(int position) { mActionBar.setSelectedNavigationItem(position); } /** * This method removes the pages from ViewPager */ public void removePages() { mActionBar.removeAllTabs(); //call to ViewPage to remove the pages vp.removeAllViews(); mFragments.clear(); //make this to update the pager vp.setAdapter(null); vp.setAdapter(pagerAdapter); } } 

代码dynamic删除和添加

 //remove the pages. basically call to method removeAllViews from ViewPager pagerAdapter.removePages(); pagerAdapter.addPage(pass your fragment); 

在Peri Hartman的build议之后,在将ViewPager适配器设置为null之后,它开始工作,并在删除视图之后再次将适配器置于其中。 在此之前,页面0不显示其列表内容。

首先:覆盖pagerAdapter方法“getItemPosition”

 @Override public int getItemPosition(Object object) { return POSITION_NONE; } } 

其次:删除与适配器绑定的数据,并调用adapter.notifydatachanged

 @Bind(R.id.pager) ViewPager pager; int pos = pager.getCurrentItem(); pager.removeViewAt(pos); 

目前为止,该解决scheme运行良好:

  public class CustomPagerAdapter extends PagerAdapter { private final List<Item> objects = new ArrayList<>(); public CustomPagerAdapter(List<Item> objects) { if (objects != null) { this.objects.add(objects); } } @Override public int getCount() { return objects.size(); } @Override public boolean isViewFromObject(View view, Object object) { Item item = (Item) object; ItemView itemView = (ItemView) view; return Objects.equals(itemView.getItem(), item); } @Override public int getItemPosition(Object object) { Item item = (Item) object; int idx = objects.indexOf(item); return idx == -1 ? POSITION_NONE : idx; } @Override public Item instantiateItem(ViewGroup container, int position) { Item item = objects.get(position); final int id = generateViewIdForItem(item); ItemView itemView = new ItemView(container.getContext()); itemView.setId(id); container.addView(itemView); itemView.setItem(item); return item; } @Override public void destroyItem(ViewGroup container, int position, Object object) { Item item = (Item) object; final int id = generateViewIdForItem(item); View view = container.findViewById(id); if (view != null) { container.removeView(view); } } public void update(@Nullable List<Item> objects) { this.objects.clear(); if (objects != null) { this.objects.addAll(objects); } notifyDataSetChanged(); } public void clear() { update(null); } /* add remove/update/add methods if you need, don't forget to call notifyDataSetChanged */ private static int generateViewIdForItem(Item item) { return Math.abs(item.hashCode()); } } 

请注意:

  • 您的Item类必须包含equalshashCode方法的相应实现
  • 你的ItemView类必须包含你的Item对象的getter和setter。