Android开发技巧——PagerAdapter的再次简单封装

来源:互联网 发布:游戏计时器软件 编辑:程序博客网 时间:2024/06/08 04:33


 

Android开发技巧——PagerAdapter的再次简单封装


这次再对内容为View的ViewPager的适配器PagerAdapter进行简单的封装,支持List数据和SparseArray的数据,带更新视图功能。

首先,先贴上最上面的抽象类代码:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. /* 
  2.  * Date: 14-8-18 
  3.  * Project: Access-Control-V2 
  4.  */  
  5. package cn.irains.access_control_v2.common;  
  6.   
  7. import android.support.v4.view.PagerAdapter;  
  8. import android.util.SparseArray;  
  9. import android.view.View;  
  10. import android.view.ViewGroup;  
  11.   
  12. import java.util.List;  
  13.   
  14. /** 
  15.  * 抽象的PagerAdapter实现类,封装了内容为View的公共操作. 
  16.  * Author: msdx (645079761@qq.com) 
  17.  * Time: 14-8-18 下午2:34 
  18.  */  
  19. public abstract class AbstractViewPagerAdapter extends PagerAdapter {  
  20.     protected SparseArray<View> mViews;  
  21.   
  22.     public AbstractViewPagerAdapter() {  
  23.         mViews = new SparseArray<View>();  
  24.     }  
  25.   
  26.     @Override  
  27.     public boolean isViewFromObject(View view, Object object) {  
  28.         return view == object;  
  29.     }  
  30.   
  31.     @Override  
  32.     public Object instantiateItem(ViewGroup container, int position) {  
  33.         View view = mViews.get(position);  
  34.         if (view == null) {  
  35.             view = newView(position);  
  36.             mViews.put(position, view);  
  37.         }  
  38.         container.addView(view);  
  39.         return view;  
  40.     }  
  41.   
  42.     public abstract View newView(int position);  
  43.   
  44.     public void notifyUpdateView(int position) {  
  45.         View view = updateView(mViews.get(position), position);  
  46.         mViews.put(position, view);  
  47.         notifyDataSetChanged();  
  48.     }  
  49.   
  50.     public View updateView(View view, int position) {  
  51.         return view;  
  52.     }  
  53.   
  54.     @Override  
  55.     public void destroyItem(ViewGroup container, int position, Object object) {  
  56.         container.removeView(mViews.get(position));  
  57.     }  
  58.   
  59. }  

这里只对View相关的操作进行封装,不涉及任何数据,并增加了两个方法,一个是notifyUpdateView(int position),调用它之后将会去更新指定位置的视图。另一个方法是public View updateView(View view, int position),在这里进行更新视图的具体操作。


接下来看数据为List的封装,代码如下:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. /* 
  2.  * Date: 14-8-18 
  3.  * Project: Access-Control-V2 
  4.  */  
  5. package cn.irains.access_control_v2.common;  
  6.   
  7. import android.view.View;  
  8.   
  9. import java.util.List;  
  10.   
  11. /** 
  12.  * 抽象的PagerAdapter实现类,封装了内容为View,数据为List类型的适配器实现. 
  13.  * Author: msdx (645079761@qq.com) 
  14.  * Time: 14-8-18 下午2:34 
  15.  */  
  16. public abstract class AbstractPagerListAdapter<T> extends AbstractViewPagerAdapter {  
  17.     protected List<T> mData;  
  18.   
  19.     public AbstractPagerListAdapter(List<T> data) {  
  20.         mData = data;  
  21.     }  
  22.   
  23.     @Override  
  24.     public int getCount() {  
  25.         return mData.size();  
  26.     }  
  27.   
  28.     public abstract View newView(int position);  
  29.   
  30.     public T getItem(int position) {  
  31.         return mData.get(position);  
  32.     }  
  33. }  

方法还是和上篇文章基本一样的,只是有些方法抽取到父类中,然后在该类中继承。

同样,数据为SparseArray的适配器封装类代码与其相似,如下:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. /* 
  2.  * Date: 14-8-18 
  3.  * Project: Access-Control-V2 
  4.  */  
  5. package cn.irains.access_control_v2.common;  
  6.   
  7. import android.util.SparseArray;  
  8. import android.view.View;  
  9.   
  10. /** 
  11.  * 抽象的PagerAdapter实现类,封装了内容为View,数据为SparseArray类型的适配器实现. 
  12.  * Author: msdx (645079761@qq.com) 
  13.  * Time: 14-8-18 下午2:34 
  14.  */  
  15. public abstract class AbstractPagerSparseAdapter<T> extends AbstractViewPagerAdapter {  
  16.     protected SparseArray<T> mData;  
  17.   
  18.     public AbstractPagerSparseAdapter(SparseArray<T> data) {  
  19.         mData = data;  
  20.     }  
  21.   
  22.     @Override  
  23.     public int getCount() {  
  24.         return mData.size();  
  25.     }  
  26.   
  27.     public abstract View newView(int position);  
  28.   
  29.     public T getItem(int position) {  
  30.         return mData.valueAt(position);  
  31.     }  
  32. }  

使用时,仅需要继承并实现newView(int position)方法即可。

0 0
原创粉丝点击