實現(xiàn)RecyclerView很簡單
前言
在日常開發(fā)中對于列表的使用無處不在祝迂,以前我們主要是用ListView柬批、GridView等adapterView進行UI顯示荆隘,Google在2014年推出了RecyclerView之后讓我們實現(xiàn)列表UI更加的容易精偿、豐富且性能更強
RecyclerView的使用
RecyclerView與之前的ListView不同蜒谤,RecyclerView本身只負責View的繪制顯示,不負責數(shù)據(jù)的操作俏让,這個在我們實現(xiàn)RecyclerView.Adapter之后對其進行數(shù)據(jù)操作的時候就會知道楞遏,這也是他之所以比ListView性能更高的原因之一!
當我們對adapter數(shù)據(jù)源進行操作之后調(diào)用對應的notify方法(例如:notifyItemChanged)首昔,就會發(fā)現(xiàn)這時候寡喝,我們只是更新了UI其實沒有更新數(shù)據(jù)和ItemView的關(guān)聯(lián)關(guān)系。那是因為在RecyclerView中除了position之外還有一個叫做layoutPosition勒奇,看名字應該也知道预鬓,所以一般而言我們更新adapter數(shù)據(jù)之后一般還會調(diào)用notifyItemRangeChanged方法以刷新ItemView與數(shù)據(jù)的關(guān)聯(lián)關(guān)系!
RecyclerView使用步驟
在這里我們主要不是為了介紹RecyclerView的使用赊颠,如果還有不明白的可以去查一下格二,這種文章到處都是,一般實現(xiàn)一個列表的步驟如下:
- 實現(xiàn)一個ViewHolder 繼承RecyclerView.ViewHolder
- 實現(xiàn)一個adapter 繼承RecyclerView.Adapter
- 得到一個RecyclerView對象
- 給RecyclerView對象設(shè)置LayoutManager
思考
到了這里巨税,大家就會發(fā)現(xiàn)其實在日常開發(fā)中肯定不會是這么個步驟蟋定,因為太麻煩了粉臊,今天我?guī)淼木褪沁@么一個封裝之后的baserecycleradapter草添,其中加入了一些日常開發(fā)中需要的小功能
baserecycleradapter設(shè)計原理
以前我們實現(xiàn)ListView的適配器的時候如何進行優(yōu)化實現(xiàn)方案,我們會給每一個convertView設(shè)置一個ViewHolder的tag扼仲,如今RecyclerView要求我們必須實現(xiàn)這么一個ViewHolder远寸,與之前有所不同抄淑,那就是這個ViewHolder是View的一個載體,通過adapter中的onBindViewHolder方法進行處理業(yè)務數(shù)據(jù)邏輯驰后。
設(shè)計思路
接口回調(diào)是通過相信大家都不會陌生肆资,這個baserecyceradapter的實現(xiàn)思路就是借用java中的繼承關(guān)系默認實現(xiàn)一個baseViewHolder,從而讓平時開發(fā)中減少一個ViewHolder的實現(xiàn)步驟灶芝,同時借用一個BaseAdapter進行處理相關(guān)的幾個方法:
- onBindViewHolder
- onCreateViewHolder
在開發(fā)的時候我們只需要繼承BaseAdapter就可以實現(xiàn)很多業(yè)務了郑原,達到我們之前ListView一樣的模式,同時為了便于老的項目將ListView改用成為RecyclerView夜涕,特意將暴露的initView方法中參數(shù)和ListView適配器中的getView一致以降低遷移成本
BaseAdapter的方法
BaseAdapter主張由適配器管理數(shù)據(jù)源犯犁,這樣一來就避免了數(shù)據(jù)源的操作異常,同時為了讓調(diào)用者不需要關(guān)心調(diào)用調(diào)用場景女器,BaseAdapter中允許在子線程中直接操作適配器的數(shù)據(jù)源方法:
方法名字 | 作用 |
---|---|
clearAll() | 清楚所有數(shù)據(jù) |
addList | 添加一個數(shù)據(jù)集合到數(shù)據(jù)源中 |
add | 添加一個對象 |
containItem | 判斷對象是否存在于數(shù)據(jù)集合中 |
getPosition | 如果對象在集合中返回其position酸役,否則返回-1 |
deleteItem | 從數(shù)據(jù)源中刪除對象 |
updateItem(int position) | 這個方法指的是刷新數(shù)據(jù)源中的對象 |
updateItem | 更新對象 |
以上查找類方法建議實現(xiàn)以下equals方法,否則可能不能起作用
其他
目前為了方便使用baserecycleradapter加入了幾個實現(xiàn)好了的適配器驾胆,具體可以查看 這里