ListView 與 RecyclerView 簡單對比

weixin_33859844發表於2018-08-25

簡單使用:

        ListView繼承重寫BaseAdapter類;

        自定義ViewHolder與convertView的優化(判斷是否為空);

        RecyclerView繼承重寫RecyclerView.Adapter與RecyclerView.ViewHolder

        設定LayoutManager,以及layout的佈局效果

區別:

        ListView的佈局比較單一,只有一個縱向效果

        RecyclerView的佈局效果豐富,可以在LayoutMananger中設定:線性佈局(橫向縱向),表格佈局,瀑布流佈局,還可以在layoutMananger的API中自定義Layout(scrollToPosition(),findViewByPosition()等等)

空資料處理:

        ListView中有個setEmptyView()用來處理資料為空的情況

        RecyclerView沒有這個API,需要進行資料判斷來實現資料為空的情況

HeaderView與FooterView:

        ListView通過addHeaderView()與addFooterView()來新增頭部底部item,來實現上拉重新整理下拉載入的情況,並不會影響Adapter的編寫

        RecyclerView沒有這兩個API,我們需要時可以在Adapter中自己編寫,根據ViewHolder的Type與View來實現,但是這樣會影響到Adapter的資料,新增了Header與Footer後實際的position會大於資料的position

區域性重新整理:

        在ListView中重新整理資料是用notifyDataSetChanged(),但是這種重新整理資料是全域性重新整理的,每個Item的資料都會重新載入一遍,就會非常消耗資源

        RecyclerView可以實現區域性重新整理,notifyItemChanged()

        但是要在ListView實現區域性重新整理,我們可以在Adapter中實現一個onItemChanged(),在方法中獲取這個item的position(可以通過getFirstVisiblePosition()),然後呼叫getView()來重新整理這個item的資料

動畫效果:

        RecyclerView已經封裝好API來實現動畫效果,例如notifyItemChanged() notifyItemMoved(),如果需要自定義的動畫效果可以通過相應的介面實現自定義的動畫效果RecyclerView.ItemANimator類,然後呼叫RecyclerView.setItemAnimator()

        ListView沒有動畫效果的實現,但我們可以在Adapter自己實現item的動畫效果

Item點選事件:

        ListView中有onItemClickListener(),onItemLongClickListener(),onItemSelectedListener(),但是新增HeaderView與FooterView就不一樣了,HeaderView與FooterView都會算進position,就有可能丟擲陣列越界。

        我們可以在getItemId()中通過返回id來標識相應的item;但是我們可以在Adapter中針對每個Item寫在getView()中比較合適

        Recycle讓View中提供了addOnItemTouchListener() 監聽item的觸控事件,我們可以通過RecyclerVIew的addOnItemTouchListener()加上Gesture Detector來實現類似ListView那樣監聽某個item某個操作方法。

相關文章