ViewPager滑动刷新数据

一、简单的解决方案

   

       这种方案我相信只要是对ViewPager数据更新问题有研究的都会了解,即覆盖PagerAdapter中的getItemPosition()方法,这种方案虽然简单,但是因为这种方法是让每次呼叫PagerAdapter时,都会遍历childView,通过getItemPosition()方法返回Item位置失去的参数,这样PagerAdapter误认为Item失去位置,因而重新建立所有childView,这样做来,开销过大,而且由于占用了getItemPosition()方法,不适用于复杂的View界面。

 

覆盖代码:

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

 

二、PagerAdapter的工作机制

 

        这里所说的工作机制,严格意义上讲就是PagerAdapter的执行顺序,也是Leo8573通过调试自己理解的。

        PagerAdapter作为ViewPager的适配器,无论ViewPager有多少页,PagerAdapter在初始化时也只初始化开始的2个View,即调用2次instantiateItem方法。而接下来每当ViewPager滑动时,PagerAdapter都会调用destroyItem方法将距离该页2个步幅以上的那个View销毁,以此保证PagerAdapter最多只管辖3个View,且当前View是3个中的中间一个,如果当前View缺少两边的View,那么就instantiateItem,如里有超过2个步幅的就destroyItem。

 

简易图示:
                       *
       ------+---+---+---+------
         ... 0 | 1 | 2 | 3 | 4 ...
       ------+---+---+---+------

     当前View为2号View,所以PagerAdapter管辖1、2、3三个View,接下来向左滑动-->

                       *
       ------+---+---+---+------
         ... 1 | 2 | 3 | 4 | 5 ...
       ------+---+---+---+------

     滑动后,当前View变为3号View,PagerAdapter会destroyItem 0号View,instantiateItem 5号View,所以PagerAdapter管辖2、3、4三个View

 

大概就是这样,各位领会精神吧,Leo8573文字表达能力还是有点差。

 

三、较通用的解决方案


       第种更合理,当然相对前一种要再多做点事:思路是在instantiateItem时给每个view加上tag,然后在需要刷新页面时通过View.getTag()来判断是否是我们想要刷新的页面,只给当前页面返回POSITION_NONE。 

Java代码  收藏代码
  1. /** 
  2.  * DispImgAdapter.java 
  3.  */  
  4. @Override  
  5.     public Object instantiateItem(ViewGroup container, int position) {  
  6.         iv = new ImageView(mContext);  
  7.         iv.setTag(position); // Add tag  
  8.         try {  
  9.             Bitmap bm = cacheImg2(position);  
  10.             iv.setImageBitmap(bm);  
  11.         } catch (OutOfMemoryError e) {  
  12.             e.printStackTrace();    
  13.         }  
  14.         ((ViewPager)container).addView(iv);  
  15.         return iv;  
  16.     }  
  17.   
  18. @Override  
  19.     public int getItemPosition(Object object) {  
  20.         View view = (View)object;  
  21.         int currentPage = ((DispImgActivity)mContext).getCurrentPagerIdx(); // Get current page index  
  22.         if(currentPage == (Integer)view.getTag()){  
  23.             return POSITION_NONE;  
  24.         }else{  
  25.             return POSITION_UNCHANGED;    
  26.         }  
  27. //      return POSITION_NONE;  
  28.     }  

  关键的currentPageIdx则需要在Activity中获取,如果你的Adapter是Activity的内部类,那么只要把index写成全局变量就可以在adapter中使用了,如果是单独的两个类,那么你就自己提供一个接口,将index传给Adapter便是。 
Java代码  收藏代码
  1. /** 
  2.  * DispImgActivity.java 
  3.  */  
  4. // Get current page index  
  5. mViewPager.setOnPageChangeListener(new OnPageChangeListener() {  
  6.             @Override  
  7.             public void onPageScrolled(int i, float f, int j) {  
  8.                   
  9.             }  
  10.   
  11.             @Override  
  12.             public void onPageSelected(int position) {  
  13.                 DispImgActivity.this.position = position;  
  14.             }  
  15.   
  16.             @Override  
  17.             public void onPageScrollStateChanged(int i) {  
  18.                   
  19.             }  
  20.         });  
  21. // Return current index to Adapter  
  22. public int getCurrentPagerIdx() {  
  23.         return position;  
  24. }  

      

你可能感兴趣的:(Android基础,AndroidStudio,Android,App)