目录

Android开发之ViewPager使用遇到的坑(持续更新)

一、前言

  • ViewPager是一个Android组件中使用频率比较高的组建,在Android开发过程中,我们在使用ViewPager时需要注意些什么呢?

二、注意事项

当你想要动态的移除ViewPager里的某个Item时,╮(╯_╰)╭居然无效!

  • 今天,在做到一个需要移除ViewPager的Item的需求时,咕噜咕噜,代码写的真流畅。。。。然而,跑起来之后发现,- -||怎么移除要么没效果,要么数据错乱,google你这是在逗我么?

  • 哎,说什么也没用,于是我点进了notifyDataSetChanged方法,看下源码里都做了什么。

      public void notifyDataSetChanged() {
      	synchronized (this) {
      		if (mViewPagerObserver != null) {
      			mViewPagerObserver.onChanged();
      		}
      	}
      	mObservable.notifyChanged();
      }
    
  • 然而,发现里面的mViewPagerObserver和mObservable都是抽象类型的。算了,先看下里面还有什么方法吧。咕噜咕噜。。。。。突然看到这么一个方法

      /**
       * Called when the host view is attempting to determine if an item's position * has changed. Returns {@link #POSITION_UNCHANGED} if the position of the given
       * item has not changed or {@link #POSITION_NONE} if the item is no longer present
       * in the adapter. * * The default implementation assumes that items will never
       * change position and always returns {@link #POSITION_UNCHANGED}.
       * * @param object Object representing an item, previously returned by a call to
       *               {@link #instantiateItem(View, int)}.
       * @return object's new position index from [0, {@link #getCount()}),
       *         {@link #POSITION_UNCHANGED} if the object's position has not changed,
       *         or {@link #POSITION_NONE} if the item is no longer present.
       */public int getItemPosition(Object object) {
      	return POSITION_UNCHANGED;
      }
    
  • 再看到顶部的这么一句话时Called when the host view is attempting to determine if an item’s position * has changed,感觉有点关系,然后赶紧把注释看完。原来该方法默认时返回POSITION_UNCHANGED的

  • POSITION_UNCHANGED是代表什么呢?根据注解大概是这个意思如果pisition指定的位置的item一直不变,就返回POSITION_UNCHANGED,而POSITION_UNCHANGED也是默认返回的。

  • 然后下面还有一个POSITION_NONE,大概意思是如果该item是不存在的就返回POSITION_NONE,OK,那么我们就试下重写getItemPosition返回POSITION_NONE吧!

  • ^o^yes,解决过程还是比较快速的。