Android: RecyclerView.ViewHolder、Adapter

1.簡介

 用戶滑動屏幕切換視圖時,上一個視圖會回收利用,RecyclerView所做的就是回收再利用,循環往復。

  • ViewHolder
    ViewHolder的主要任務:容納View視圖

  • Adapter
     Adapter從模型層獲取數據,然後提供給RecyclerView顯示,是溝通的橋樑。

  • Adapter主要的任務是:創建ViewHolder和將模型層的數據綁定到ViewHolder上。

RecyclerView與Adapter交互流程

 

 

 首先,調用Adapter.getItemCount()方法,RecyclerView詢問數組列表包含多少個待展示的視圖
 接着,RecyclerView調用Adapter.onCreateViewHolder(ViewGroup, int)創建ViewHolder
 最後,RecyclerView會傳入ViewHolder及其位置(position)調用onBindViewHolder(ViewHolder, int)方法。Adapter會找到目標位置的數據並將其綁定到ViewHolder的視圖上
 需要注意的是相對於onBindViewHolder(),onCreateViewHolder()方法調用並不頻繁。一旦有了夠用的ViewHolder,RecyclerView就會停止調用onCreateViewHolder()方法。隨後,它會回收利用舊的ViewHolder以節約時間和內存

  • LayoutManager
     RecyclerView不會親自擺放屏幕上的列表項,擺放列表項的任務被委託給了LayoutManager。除了在屏幕上擺放列表項,LayoutManager還負責定義屏幕滾動行爲
     除了一些Android系統內置版實現,LayoutManager還有很多第三方庫實現版本。

2.ViewHolder

ViewHolder承載的是每一個列表項的視圖,所以當使用RecyclerView的時候需要先對ViewHolder進行初始化定義

private class CrimeHolder extends RecyclerView.ViewHolder {
          public CrimeHolder(LayoutInflater inflater, ViewGroup parent) {
            super(inflater.inflate(R.layout.list_item_crime, parent, false));
      }
}

 注意到CrimeHolder構造器方法調用了父類構造器super(View view)----ViewHolder(View view)。因而CrimeHolder實際上引用了已被實例化的list_item_crime佈局的視圖,且同時這個視圖被賦給了父類變量itemView,我們可以在itemView變量處獲得該視圖。

3.Adapter

 當需要顯示新創建ViewHolder數據和已創建的ViewHolder關聯時,就會用到Adapter。在Adapter中通常需要實現3個方法:

  • onCreateViewHolder(ViewGroup parent, int viewType)
     當需要新的ViewHolder來顯示列表項時,會調用onCreateViewHolder方法去創建ViewHolder
public CrimeHolder onCreateViewHolder(ViewGroup parent, int viewType) {
      LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
      return new CrimeHolder(layoutInflater, parent);
}
  • onBindViewHolder(CrimeHolder holder, int position)
     將數據綁定在ViewHolder上。
public void onBindViewHolder(CrimeHolder holder, int position) {
        holder.bind(position);
}
  • getItemCount()
    返回總共要顯示的列表的數量(創建的ViewHolder數量比前者要小得多)。
public int getItemCount() {
        return list.size();
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章