zoukankan      html  css  js  c++  java
  • Android Adapter的几个方法

    1  ListView是在什么时候设置对Adapter的数据监听的?

    在setAdapter(ListAdapter adapter)中,会先取消ListView中原来的mAdapter中的数据监听(mAdapter.unregisterDataSetObserver(mDataSetObserver);),然后再设置对新设置的adapter的数据监听。

    2  getView(int position, View convertView, ViewGroup parent)

    我们都知道mAdapter的getView方法很重要,那么该方法在ListView是怎么被利用的呢? 在ListView的源码中没有发现getView方法的调用,于是我们去ListView的父类AbsListView。在AbsListView中的obtainView中调用了getView,其主要代码逻辑部分为:

     1     View obtainView(int position, boolean[] isScrap) {
     2         isScrap[0] = false;
     3         View scrapView;
     4         //从回收器中获取view
     5         scrapView = mRecycler.getScrapView(position);
     6 
     7         View child;
     8         if (scrapView != null) {
     9             ...
    10             //若不为空,则传入convertView,这样的话重用了view,同时更新了数据
    11             child = mAdapter.getView(position, scrapView, this);
    12             ...
    13         } else {
    14             //若为空,则在getView中重新创建HolderView,且填入数据
    15             child = mAdapter.getView(position, null, this);
    16             ...
    17         }
    18         return child;
    19     }

    而obtainView又会在ListView的measure以及生成整个ListView等中用到。

    对于重写getView方法最终要的应该就是要记得convertView的重用了,没有重用几乎都会造成内存卸了。

    3  getCount()

    Adapter的getCount()用来干啥?  在ListView中,在onMeasure以及触控分发响应等过程中都会用到Adapter的getCount()函数。毫无疑问的是:它应该返回底层数据的数据个数。

    4  getItem(int position)

    getItem()在AdapterView中被调用,然后供用户调用:从这两个函数的描述我们可以看出,我们应该在Adapter的getItem()方法中返回position对应的数据,但是不是说一定要返回用于在Item的View上展示的数据,这个还是看需求,虽然可能大部分情况都是返回View中展示的数据。

        /**
         * Gets the data associated with the specified position in the list.
         *
         * @param position Which data to get
         * @return The data associated with the specified position in the list
         */
        public Object getItemAtPosition(int position) {
            T adapter = getAdapter();
            return (adapter == null || position < 0) ? null : adapter.getItem(position);
        }
        
        /**
         * @return The data corresponding to the currently selected item, or
         * null if there is nothing selected.
         */
        public Object getSelectedItem() {
            T adapter = getAdapter();
            int selection = getSelectedItemPosition();
            if (adapter != null && adapter.getCount() > 0 && selection >= 0) {
                return adapter.getItem(selection);
            } else {
                return null;
            }
        }

    纵观整个结构,可以说存在这样的三层:dataLists(原底层数据)--Adapter--AdapterView,有了getItem()方法的存在,我们可以直接利用Adapter来获取数据,而不需要获取底层dataLists的引用;有了getItemAtPosition()方法的存在,我们可以直接利用AdapterView 获取底层数据,而不需要获取其Adapter的引用。这样的话,对于编程的简便性以及解耦性都好很多。

    5    getItemId(int position)

    在AdapterView中发现它的一些调用, 

     1     public long getItemIdAtPosition(int position) {
     2         T adapter = getAdapter();
     3         return (adapter == null || position < 0) ? INVALID_ROW_ID : adapter.getItemId(position);
     4     }
     5     
     6     
     7     private void fireOnSelected() {
     8         if (mOnItemSelectedListener == null)
     9             return;
    10 
    11         int selection = this.getSelectedItemPosition();
    12         if (selection >= 0) {
    13             View v = getSelectedView();
    14             //这里调用的getItemId得到的返回值与selection都属于同一个item的特征,其意义也就在于在选择接口的onItemSelected方法中可
    15             //以直接拿到该item的id,而不需要通过获取adapter来间接实现
    16             mOnItemSelectedListener.onItemSelected(this, v, selection,
    17                     getAdapter().getItemId(selection));
    18         } else {
    19             mOnItemSelectedListener.onNothingSelected(this);
    20         }
    21     }
    22     
    23     int findSyncPosition() {
    24         ...
    25             rowId = adapter.getItemId(seed);
    26             if (rowId == idToMatch) { //从这里来看,getItemId似乎应该对于不同的item返回不同的值,保持唯一性
    27                 // Found it!
    28                 return seed;
    29             }
    30         ...
    31     }

    与上面分析的getItem()方法一样,getItemId()和getItemIdAtPosition()都提供了编程上面的便利。但是目前来看,由于对id没啥需求,所以大部分在重写getItemId方法时都是直接返回的position值,这样做也是对的,虽然从数据获取上没啥意义(我给你一个position,你原封不动的返回给我,啥意思)。但是我想说明的是,不要被这个做法所限制,而以为ItemId就是item在数据中的position。其实若有需求,可以利用getItemId()方法返回一些其他的值,比如每个item数据在数据库中id值,或者每个人的身份证号等。

  • 相关阅读:
    自定义、操作cookie
    云中沙箱学习笔记2-ECS之初体验
    云中沙箱学习笔记1-快速部署并使用MySQL数据库
    练习小程序
    理解Thread.sleep()函数
    排序:冒泡排序;直接选择排序;反转排序
    float和double
    BigDecimal
    Linux学习笔记5(2)-CentOS7中Tomcat8修改jvm内存配置
    ret2dl学习笔记
  • 原文地址:https://www.cnblogs.com/willhua/p/5636033.html
Copyright © 2011-2022 走看看