原創文章,轉載請聯繫做者java
這是Kotlin實踐日記的第一章,使用Kotlin構建一個,使用方便、多功能的Recyclerview適配器——AcrobatAdapter
。
git
AcrobatAdapter
讓開發者專一於Item的配置,包括Item
的UI和數據顯示,以及單擊、雙擊、長按事件【且不會影響子View的事件傳遞】。並且不只僅是單Item Style
列表,仍是多Item Style
列表,AcrobatAdapter
的使用都是同樣方便簡單。github
AcrobatAdapter
的設計靈感來自於夜叉,個人函數名稱也沿用夜叉的函數名,由於itemDSL
這個名稱是在太貼切了。夜叉這個項目是針對Recyclerview總體來構建,推薦小可愛們去看看。bash
GitHub
連接放在文章底部哦。
下面將展現使用文檔。ide
####普通列表函數
val acrobatAdapter = AcrobatAdapter<Int> {
itemDSL {
resId(R.layout.item_test)
showItem { d, pos, view ->
view.item_tv.text = "數據Item" + d
}
}
}.setData(數據源)
recycler_view.adapter = acrobatAdapter
複製代碼
噠噠,以上代碼就成功構建了一個列表
resId()函數綁定Item的佈局ID
showItem函數內,渲染數據,d表示此項Item對應數據,會根據適配器泛型自動轉換。pos爲Item的position,view是Item的佈局View。並且Kotlin支持使用Id表明控件,不再用寫findViewById啦!
最後,適配器的setData方法內置了DiffUtils,會對比新舊數據,這樣在數據刷新時Recyclerview會有默認動畫展現。讓交互更加平滑。佈局
首先Item相關類,繼承AcrobatItem
。性能
class Test : AcrobatItem<Int>() {
override fun showItem(d: Int, pos: Int, view: View) {
view.item_tv.text = "共用Item" + d
}
override fun getResId(): Int = R.layout.item_test
}
複製代碼
在適配器中:動畫
val acrobatAdapter = AcrobatAdapter<Int> {
item {
Test()
}
}.setData(數據源)
recycler_view.adapter = acrobatAdapter
複製代碼
讓你的Item繼承
AcrobatItem
便可。這樣再多的界面複用Item也徹底可行,但要注意的一點是:Item的數據類型必須一致。ui
多item樣式的話,寫多個ItemDSL便可!每個ItemDSL
就表明一種獨有的Item樣式。同理,每調用一次item
,也就多一種Item樣式。
val acrobatAdapter = AcrobatAdapter<Int> {
itemDSL {
resId(R.layout.item_test)
showItem { d, pos, view ->
view.item_tv.text = "數據Item: " + d
}
isMeetData { d, pos -> pos == 1 }
}
itemDSL {
resId(R.layout.item_test1)
showItem { d, pos, view ->
view.item_tv.text = "cece: " + d
}
isMeetData { d, pos -> pos != 1 }
}
}.setData(數據源)
recycler_view.adapter = acrobatAdapter
複製代碼
isMeetData函數兩個參數爲數據和position。用這兩個參數來判斷此Item在哪一個位置、什麼條件展現。譬如示例代碼,position爲1時是一個樣式,不爲1時是另外一種樣式。但要注意,全部的Item的isMeetData的條件都是互斥的噢。不然會拋出異常。
AcrobatAdapter
替你搞定。每一個Item不但有單擊click
,還附帶了雙擊DoubleTap
和長按LongPress
事件。並且徹底不會影響Item佈局View內部childView的事件。val acrobatAdapter = AcrobatAdapter<Int> {
itemDSL {
resId(R.layout.item_test)
showItem { d, pos, view ->
view.item_tv.text = "數據Item: " + d
}
onClick {
toastS("單擊")
}
onDoubleTap {
toastS("雙擊")
}
longPress {
toastS("長按")
}
}
itemDSL {
resId(R.layout.item_test1)
showItem { d, pos, view ->
view.item_tv1.text = "另外一種樣式" + d
}
isMeetData { d, pos -> pos == 1 }
onClick {
toastS("單擊另外一種Item")
}
onDoubleTap {
toastS("雙擊另外一種Item")
}
longPress {
toastS("長按另外一種Item")
}
}
}.setData(數據源)
複製代碼
三個事件都是單獨綁定Item的樣式的!當使用多Item樣式列表時,不再用在click事件中,寫不少的條件判斷了!
AcrobatAdapter
不但支持Item綁定事件,也支持Adapter外部綁定事件。但這樣就須要開發者,在外部事件裏區分多Item樣式了。AcrobarAdapter
的bindEvent()
函數val acrobatAdapter = AcrobatAdapter<Int> {
itemDSL {
resId(R.layout.item_test)
showItem { d, pos, view ->
view.item_tv.text = "數據Item: " + d
}
isMeetData { d, pos -> pos != 1 }
}
}.setData(data).bindEvent {
onClick {
toastS("外部單擊")
}
onDoubleTap {
toastS("外部雙擊")
}
longPress {
toastS("外部長按")
}
}
複製代碼
onViewCreated(parent,view)
函數val acrobatAdapter = AcrobatAdapter<Int> {
itemDSL {
resId(R.layout.item_test)
showItem { d, pos, view ->
view.item_tv.text = "數據Item: " + d
}
onViewCreate { parent, view ->
做一些和數據無關的UI操做,譬如view設置爲圓形
或者EditText的addTextChangedListener
}
}
}
複製代碼
showItem()函數是綁定在適配器的onBingViewHolder函數裏的,觸發會比較頻繁。若是在
showItem
內作一些UI操做,會比較浪費性能.onViewCreated
函數是綁定在適配器的onCreateViewHolder
函數內
Recyclerview若是須要刷新Item的話,不建議使用notifyItemChanged(int position)
方法,由於這個方法會刷新整個Item的視圖。在視覺上的直觀體現就是,Item會閃爍。因此建議使用以下方法刷新Item:
notifyItemChanged(int position, Object payload)
複製代碼
使用上面這個方法,不會重繪整個View的視圖。
val acrobatAdapter = AcrobatAdapter<Int> {
itemDSL {
resId(R.layout.item_test)
showItem { d, pos, view ->
view.item_tv.text = "數據Item: " + d
}
showItemPayload { d, pos, view, payloads ->
刷新Item的某個特定的ChildView。
譬如在某個Item刷新進度條。下面爲僞代碼
view.progreess_bar.setProgress(100%)
}
}
}
複製代碼
下面簡單作一下效果展現:
#####使用notifyItemChanged(int position)
和showItem
刷新佈局
#####使用notifyItemChanged(int position, Object payload)
和showItemPayload
刷新佈局
效果對比,一目瞭然。
AcrobatAdapter,連接在此,你們要是喜歡的話不妨點個star吧。
Kotlin已成爲Android開發的官方語言,無論工做上用獲得用不到,你們瞭解一二仍是有必要的。畢竟這個時代變化的太快了。
以上