每次遇到項目中簡單的列表都需要寫一遍適配器豈不是很麻煩,這次通過Kotlin簡潔的語法結(jié)構(gòu)址晕,重寫了一遍通用的適配器類,它適用于簡單重復(fù)的RecyclerView的Item樣式顿锰,例如電話簿列表谨垃、好友列表和新聞列表等,并且不存在上下快速滑動時數(shù)據(jù)錯位的現(xiàn)象硼控。
先看看它的使用方法乘客,只需要傳入顯示的List、Item的Layout布局和實現(xiàn)一個回調(diào)接口即可完成適配器的綁定淀歇∫缀耍回調(diào)接口中返回的viewHolder和position分別表示,當(dāng)前item的布局和當(dāng)前下標(biāo)浪默。
private universalAdapter : UniversalAdapter<Room>? = null // 通用適配器
private roomList = ArrayList<Room>() // 房間列表
initRecyclerView() {
universalAdapter = UniversalAdapterK(roomList!!, R.layout.item_room, object : OnBindViewListener<RunningTime>{
override fun onItemViewBinding(viewHolder: UniversalAdapterK<RunningTime>.ViewHolder, position: Int) {
// 從List中獲取當(dāng)前item
val room = roomList.get(position)
// 獲取當(dāng)前item的布局
val itemView = viewHolder.itemView
// 給這個布局上面的文本框賦值
itemView.tv_room_name.setText(room.roomName)
// TODO 當(dāng)然你也可以給這個item牡直,或是item里面的一個按鈕加上點擊事件
})
recyclerview.setAdapter(universalAdapter)
}
通過以下的代碼實現(xiàn)通用適配器的實現(xiàn)缀匕,Kotlin寫法主要體現(xiàn)在了類的聲明、構(gòu)造函數(shù)和方法定義上碰逸。(工具類直接復(fù)制進(jìn)自己項目即可)
class UniversalAdapterK<T>
(private var mDataList: ArrayList<T>, // 需要使用的數(shù)據(jù)源
private val itemLayout: Int, // 列表布局
private val onBindViewListener: OnBindViewListener<T>) // 回調(diào)接口
: RecyclerView.Adapter<UniversalAdapterK<T>.ViewHolder>() {
override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): ViewHolder =
ViewHolder(LayoutInflater.from(viewGroup.context).inflate(itemLayout, viewGroup, false))
override fun onBindViewHolder(viewHolder: UniversalAdapterK<T>.ViewHolder, i: Int) =
onBindViewListener.onItemViewBinding(viewHolder, i)
override fun getItemCount(): Int = mDataList.size
/**
* 使用這個替代原來的notifyDataSetChanged
*
* @param mDataList
*/
fun refresh(mDataList: ArrayList<T>) {
this.mDataList = mDataList
notifyDataSetChanged()
}
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
interface OnBindViewListener<T> {
/**
* 回調(diào)每個item的view
*/
fun onItemViewBinding(viewHolder: UniversalAdapterK<T>.ViewHolder, position: Int)
}
}
關(guān)于構(gòu)造函數(shù):Kotlin支持直接在類名后面的括號中直接定義有參構(gòu)造函數(shù)乡小,類似于以前的private name = "";
加上this.name = name;
的結(jié)合。
關(guān)于方法定義:采用單行寫法可以把{}
省去饵史,替換成=
满钟,后面跟上需要return的表達(dá)式。
關(guān)于內(nèi)部類與繼承:KT在聲明內(nèi)部類的時候胳喷,必須要加上inner
關(guān)鍵字湃番,否則編譯將不通過。拿以上代碼里的ViewHolder內(nèi)部類舉例吭露,其中類名后面的(itemView: View)
就是這個對象的構(gòu)造函數(shù)吠撮,如果不寫成ViewHolder(private var itemView: View)
,那么系統(tǒng)將會自動默認(rèn)它有對外的set/get方法讲竿,也是可以在外部被調(diào)用泥兰。ViewHolder繼承了RecyclerView.ViewHolder,可是父類需要子類重寫一遍構(gòu)造函數(shù)题禀,那么我們括號里扔進(jìn)一個itemView
鞋诗,這個itemView就是前面在定義ViewHolder時傳進(jìn)來的itemView,可以類似于Java寫法中的super(itemView)
迈嘹。所以KT用一行代碼就完成了:內(nèi)部類聲明+子類構(gòu)造函數(shù)聲明+調(diào)用父類構(gòu)造函數(shù)+set/get函數(shù)定義师脂。