WEB开发网
开发学院手机开发Android 开发 Android基于SackOfViewAdapter类实现类似状态通知... 阅读

Android基于SackOfViewAdapter类实现类似状态通知栏的布局

 2012-09-17 20:36:36 来源:WEB开发网   
核心提示: 一般来说,ListView的列表项都会采用相同的布局,Android基于SackOfViewAdapter类实现类似状态通知栏的布局,只是填充的内容不同而已,这种情况下,则返回true */ @Override public boolean isEnabled(int position) {

 一般来说,ListView的列表项都会采用相同的布局,只是填充的内容不同而已,这种情况下,Android提供了convertView帮我们缓存列表项,达到循环利用的目的,开发者也会使用ViewHolder模式来对ListView进行优化。但有的情况下,ListView的列表项布局是不尽相同的,甚至差别很大,这时就不能简单的使用同一个布局资源文件来表示不同类型的列表项了,而是必须区别对待。典型的情况如Android状态通知栏,如下图所示。

 
360安全卫士、唱吧,闪推这三款应用在状态通知栏的布局差别很大,那么我们又想使用同一个Adapter来表示不同列表项,这时就需要在Adapter中使用容器来包含这些不同的View了。这里定义SackOfViewAdapter类,继承BaseAdapter,在该类中定义容器变量mViewList来存储ListView中不同列表项的view;同时,定义两个构造函数,一个是在参数中指定容器的大小,并填充null值;一个则直接传入ListView列表项中所有view的集合。代码如下:

 
SackOfViewAdapter类的关键代码在newView函数和getView函数,其中newView函数用于给容器变量mViewList中值为null的元素赋值,一般由SackOfViewAdapter的子类实现。而getView函数重写自BaseAdapter类,是Adapter返回View类实例的关键函数,代码如下所示:

 
SackOfViewAdapter类的完整代码如下所示:
  1. public class SackOfViewsAdapter extends BaseAdapter { 
  2.  
  3.   private List<View> mViewList = null; 
  4.  
  5.   /** 
  6.    * 构造大小为count,值为null的view集合,这时需要子类重写newView函数 
  7.    */ 
  8.   public SackOfViewsAdapter(int count) { 
  9.     super(); 
  10.     mViewList = new ArrayList<View>(count); 
  11.     for (int i = 0; i < count; i++) { 
  12.       mViewList.add(null); 
  13.     } 
  14.   } 
  15.  
  16.   /** 
  17.    * 由传入的view集合直接给容器赋值,如果view集合中有为null值的view,则子类必须实现newView函数 
  18.    */ 
  19.   public SackOfViewsAdapter(List<View> views) { 
  20.     super(); 
  21.     this.mViewList = views; 
  22.   } 
  23.  
  24.   /** 
  25.    * 返回对应位置的列表项 
  26.    */ 
  27.   @Override 
  28.   public Object getItem(int position) { 
  29.     return mViewList.get(position); 
  30.   } 
  31.  
  32.   /** 
  33.    * 返回列表项的个数 
  34.    */ 
  35.   @Override 
  36.   public int getCount() { 
  37.     return mViewList.size(); 
  38.   } 
  39.  
  40.   /** 
  41.    * getView函数创建的列表项类型个数 
  42.    */ 
  43.   @Override 
  44.   public int getViewTypeCount() { 
  45.     return getCount(); 
  46.   } 
  47.  
  48.   /** 
  49.    * getView函数创建的view类型值,这里以view所在的位置作为类型值 
  50.    */ 
  51.   @Override 
  52.   public int getItemViewType(int position) { 
  53.     return position; 
  54.   } 
  55.  
  56.   /** 
  57.    * 如果Adapter中所有列表项都是可点击和可选择的,则返回true 
  58.    */ 
  59.   @Override 
  60.   public boolean areAllItemsEnabled() { 
  61.     return false; 
  62.   } 
  63.  
  64.   /** 
  65.    * 如果position所指的列表项不是分隔符,则返回true 
  66.    */ 
  67.   @Override 
  68.   public boolean isEnabled(int position) { 
  69.     return false; 
  70.   } 
  71.  
  72.   /** 
  73.    * 返回指定位置position的列表项的view 
  74.    */ 
  75.   @Override 
  76.   public View getView(int position, View convertView, ViewGroup parent) { 
  77.     View result = mViewList.get(position); 
  78.  
  79.     // 如果mViewList中的view为null,则需要调用newView函数来创建一个,该函数由子类来实现 
  80.     if (result == null) { 
  81.       result = newView(position, parent); 
  82.       mViewList.set(position, result); 
  83.     } 
  84.  
  85.     return result; 
  86.   } 
  87.    
  88.   /** 
  89.    * 创建列表中指定位置的列表项,该函数有子类实现 
  90.    */ 
  91.   protected View newView(int position, ViewGroup parent) { 
  92.     throw new RuntimeException("You must override newView()!"); 
  93.   } 
  94.  
  95.   /** 
  96.    * 获得指定位置的列表项的id 
  97.    */ 
  98.   @Override 
  99.   public long getItemId(int position) { 
  100.     return position; 
  101.   } 
  102.  
  103.   /** 
  104.    * 判断Adapter中是否存在某个指定的view 
  105.    */ 
  106.   public boolean hasView(View v) { 
  107.     return mViewList.contains(v); 
  108.   } 
  109.  
  110. } 

1 2  下一页

Tags:Android 基于 SackOfViewAdapter

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接