RecyclerView通用Adapter適配器,Kotlin 40行代碼精簡實現(xiàn)

每次遇到項目中簡單的列表都需要寫一遍適配器豈不是很麻煩,這次通過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ù)定義。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容