Chinaunix首页 | 论坛 | 博客
  • 博客访问: 90234
  • 博文数量: 24
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 231
  • 用 户 组: 普通用户
  • 注册时间: 2015-06-13 21:06
个人简介

来也匆匆 几十繁华一阵风; 去也匆匆 回头一看已成空

文章分类

全部博文(24)

文章存档

2016年(4)

2015年(20)

我的朋友

分类: Android平台

2015-09-28 00:46:03


点击(此处)折叠或打开

  1. //frameworks\base\core\java\android\widget\Adapter.java
  2. /**
  3. * Adapter对象作为AdapterView视图与底层数据之间的桥梁;
  4. * Adapter提供了对数据项的访问;也负责为数据集的每个数据项产生一个对应的View。
  5. */
  6. public interface Adapter {
  7.     /**
  8.      * 注册一个Observer,当Adapter所使用的发送改变时,它会被调用到。
  9.      * DataSetObserver是个抽象类,有onChanged和onInvalidated两个方法。
  10.      */
  11.     void registerDataSetObserver(DataSetObserver observer);

  12.     /**
  13.      * 注销使用上述接口注册的Observer
  14.      */
  15.     void unregisterDataSetObserver(DataSetObserver observer);

  16.     /**
  17.      * 获取该Adapter所代表的数据集中数据项的数量
  18.      */
  19.     int getCount();
  20.     
  21.     /**
  22.      * 获取数据集中指定位置的数据项
  23.      */
  24.     Object getItem(int position);
  25.     
  26.     /**
  27.      * 获取指定位置的数据项的ID
  28.      */
  29.     long getItemId(int position);
  30.     
  31.     /**
  32.      * 判断数据项的ID是否是稳定的,也就是不会随着底层数据的改变而改变
  33.      * 如果同样的对象返回同样的ID,则返回true
  34.      */
  35.     boolean hasStableIds();
  36.     
  37.     /**
  38.      * 获取一个显示数据集中指定位置的数据的View;你可以手动创建一个View或者由XML布局文件中生成;
  39.      * 当View生成时,其父View(GridView, ListView...) 将使用默认的布局参数,除非你用如下的函数
  40.      * android.view.LayoutInflater#inflate(int, android.view.ViewGroup, boolean)
  41.      * 指定一个根View,并且避免它附加到这个根View上。.
  42.      *
  43.      * @param position 数据项在数据集中的位置
  44.      * @param convertView 可以复用的旧View;注意:使用前,你要检查它非空,并且类型也合适;
  45.      * 如果它不能转换成显示正确数据的View,这个方法能创建一个新的View;
  46.      // 为了避免产生大量的View浪费内存,在Android中,AdapterView中的View是可回收的使用的。
  47.      // 比如你有100项数据要显示,而你的屏幕一次只能显示10条数据,则只产生10个View,
  48.      // 当往下拖动要显示第11个View时,会把第1个View的引用传递过去,更新里面的数据再显示,
  49.      // 也就是说View可重用,只是更新视图中的数据用于显示新的一项
  50.      // 如果一个视图的视图类型是IGNORE_ITEM_VIEW_TYPE的话,则此视图不会被重用
  51.      * Heterogeneous列表能指定它们的所有View类型,因此,View的类型总是对的。
  52.      * @param parent 这个View最终被添加到其上的父控件。
  53.      * @return 与指定位置的数据,对应的View。
  54.      */
  55.     View getView(int position, View convertView, ViewGroup parent);
  56.     /**
  57.      * 可以导致AdapterView忽略数据项View的类型;
  58.      * 比如,如果客户端不想要一个为getView(int, View, ViewGroup)转换的特殊的View时,就可以用这个。
  59.      */
  60.     static final int IGNORE_ITEM_VIEW_TYPE = AdapterView.ITEM_VIEW_TYPE_IGNORE;
  61.     
  62.     // 获得相应位置的这图类型
  63.     /**
  64.      * 获取将要通过getView,为指定数据项创建的的View的类型
  65.      * @return 整数代表View的类型;在getView中的两种View可以相互转换的话,应该共享同一种类型;
  66.      * 注意:整数必须在0到getViewTypeCount-1之间,也可以返回IGNORE_ITEM_VIEW_TYPE。
  67.      * @see #IGNORE_ITEM_VIEW_TYPE
  68.      */
  69.     int getItemViewType(int position);
  70.     
  71.     /**
  72.      * 返回通过getView创建的View类型的数量,每种类型代表在getView中可以相互转换的一组View;
  73.      * 如果适配器为所有数据项,总是返回同样的类型,该方法应该返回1.
  74.      * 这个方法仅当适配器设置给AdapterView时,才被调用到;
  75.      */
  76.     int getViewTypeCount();
  77.     
  78.     static final int NO_SELECTION = Integer.MIN_VALUE;

  79.      /**
  80.       * 如果该适配器不包含任何数据,则返回true;它用来决定是否显示空View;
  81.       * 一个典型的实现是返回getCount() == 0,但是当getCount()包含header和footers时,
  82.       * 特殊的适配器,应该是想要实现一个不一样的行为。
  83.       */
  84.      boolean isEmpty();
  85. }


  86. //frameworks\base\core\java\android\widget\BaseAdapter.java
  87. /**
  88. * 它是一个基类,是对Adapter接口的一般实现;
  89. * 即可用于ListView(实现了指定的ListAdapter接口),也可用于Spinner(实现了SpinnerAdapter接口);
  90. */
  91. public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {
  92.     private final DataSetObservable mDataSetObservable = new DataSetObservable();

  93.     public boolean hasStableIds() {
  94.         return false;
  95.     }
  96.     
  97.     public void registerDataSetObserver(DataSetObserver observer) {
  98.         mDataSetObservable.registerObserver(observer);
  99.     }

  100.     public void unregisterDataSetObserver(DataSetObserver observer) {
  101.         mDataSetObservable.unregisterObserver(observer);
  102.     }
  103.     
  104.     /**
  105.      * 通知附加的观察者,底层数据已经改变,任何与数据集相关联的View都应该重绘。
  106.      */
  107.     public void notifyDataSetChanged() {
  108.         mDataSetObservable.notifyChanged();
  109.     }

  110.     /**
  111.      * 通知附件的观察者,底层数据已经无效或不可用;当适配器无效并不应该再报数据集变化时触发。
  112.      */
  113.     public void notifyDataSetInvalidated() {
  114.         mDataSetObservable.notifyInvalidated();
  115.     }

  116.     public boolean areAllItemsEnabled() {
  117.         return true; //都有效,无分隔项
  118.     }

  119.     public boolean isEnabled(int position) {
  120.         return true; //都有效
  121.     }

  122.     public View getDropDownView(int position, View convertView, ViewGroup parent) {
  123.         return getView(position, convertView, parent);
  124.     }

  125.     public int getItemViewType(int position) {
  126.         return 0; //数据项的类型都是0,都相同
  127.     }

  128.     public int getViewTypeCount() {
  129.         return 1; //数据项的类型数为0,都相同
  130.     }
  131.     
  132.     public boolean isEmpty() {
  133.         return getCount() == 0; //项数为0即是空
  134.     }
  135. }

ListView,如果手机屏幕一次只能显示10条item,而ListView总共有20(或更多)条数据,item view应该只会生成11(第)个,其余全部共享。为什么会生成11个而不是10个?主要是考虑第一个item被遮住了一部分,而第11个item只显示了一部分这种情况!

    从网上找了一张图片:

阅读(1355) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~