国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android Adapter的幾個常用方法

2019-12-12 05:18:27
字體:
來源:轉載
供稿:網友

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,其主要代碼邏輯部分為:

View obtainView(int position, boolean[] isScrap) {    isScrap[0] = false;    View scrapView;    //從回收器中獲取view    scrapView = mRecycler.getScrapView(position);    View child;    if (scrapView != null) {      ...      //若不為空,則傳入convertView,這樣的話重用了view,同時更新了數據      child = mAdapter.getView(position, scrapView, this);      ...    } else {      //若為空,則在getView中重新創建HolderView,且填入數據      child = mAdapter.getView(position, null, this);      ...    }    return child;  }

而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中發現它的一些調用,

public long getItemIdAtPosition(int position) {    T adapter = getAdapter();    return (adapter == null || position < 0) ? INVALID_ROW_ID : adapter.getItemId(position);  }      private void fireOnSelected() {    if (mOnItemSelectedListener == null)      return;    int selection = this.getSelectedItemPosition();    if (selection >= 0) {      View v = getSelectedView();      //這里調用的getItemId得到的返回值與selection都屬于同一個item的特征,其意義也就在于在選擇接口的onItemSelected方法中可      //以直接拿到該item的id,而不需要通過獲取adapter來間接實現      mOnItemSelectedListener.onItemSelected(this, v, selection,          getAdapter().getItemId(selection));    } else {      mOnItemSelectedListener.onNothingSelected(this);    }  }    int findSyncPosition() {    ...      rowId = adapter.getItemId(seed);      if (rowId == idToMatch) { //從這里來看,getItemId似乎應該對于不同的item返回不同的值,保持唯一性        // Found it!        return seed;      }    ...  }

與上面分析的getItem()方法一樣,getItemId()和getItemIdAtPosition()都提供了編程上面的便利。但是目前來看,由于對id沒啥需求,所以大部分在重寫getItemId方法時都是直接返回的position值,這樣做也是對的,雖然從數據獲取上沒啥意義(我給你一個position,你原封不動的返回給我,啥意思)。但是我想說明的是,不要被這個做法所限制,而以為ItemId就是item在數據中的position。其實若有需求,可以利用getItemId()方法返回一些其他的值,比如每個item數據在數據庫中id值,或者每個人的身份證號等。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 迭部县| 谢通门县| 连云港市| 吴江市| 宁明县| 会理县| 高州市| 嘉祥县| 滨海县| 会昌县| 当雄县| 柏乡县| 东港市| 集贤县| 南城县| 南京市| 奈曼旗| 普洱| 梁河县| 资兴市| 姜堰市| 新津县| 木兰县| 滦南县| 安吉县| 丰都县| 晋中市| 嘉祥县| 东平县| 徐闻县| 萍乡市| 铜陵市| 昌乐县| 龙海市| 盘锦市| 南充市| 福泉市| 时尚| 建始县| 道真| 临沂市|