Android列表通用適配器Kotlin版

適用於ListView和GridView

import android.content.Context
import android.text.Editable
import android.util.SparseArray
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.EditText
import android.widget.TextView

abstract class BaseListAdapter<T>(private val list: MutableList<T>, private val mLayoutRes: Int): BaseAdapter() {

    override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
        val holder: ViewHolder = ViewHolder.bind(parent?.context!!, convertView, parent, mLayoutRes, position)
        bindView(holder, getItem(position))
        return holder.getItemView()
    }

    override fun getItem(position: Int): T {
        return list[position]
    }

    override fun getItemId(position: Int): Long {
        return position as Long
    }

    override fun getCount(): Int {
        return list.size
    }

    abstract fun bindView(holder: ViewHolder, t: T)

    class ViewHolder(context: Context, parent: ViewGroup, mLayoutRes: Int) {

        private lateinit var itemView: View
        private var itemViews: SparseArray<View> = SparseArray()
        private var position: Int = 0

        init {
            var convertView = LayoutInflater.from(context).inflate(mLayoutRes, parent, false)
            convertView.tag = this
            itemView = convertView
        }

        companion object {
            fun bind(context: Context, convertView: View?, parent: ViewGroup, mLayoutRes: Int, position: Int): ViewHolder {
                var holder: ViewHolder? = null
                if (convertView == null) {
                    holder = ViewHolder(context, parent, mLayoutRes)
                } else {
                    holder = convertView.tag as ViewHolder
                    holder.itemView = convertView
                }
                holder.position = position
                return holder
            }
        }

        private fun <T: View> getView(id: Int): T? {
            var t: T? = null
            var view: View? = itemViews.get(id)
            if (view != null) {
                t = view as T
            } else {
                t = itemView.findViewById(id)
                itemViews.put(id, t)
            }
            return t
        }

        fun getItemView(): View {
            return itemView
        }

        fun getItemPosition(): Int {
            return position
        }

        fun setText(id: Int, text: CharSequence): ViewHolder {
            val view: View = getView(id)!!
            if (view is TextView) {
                view.text = text
            } else if (view is EditText) {
                view.text = text as Editable?
            }
            return this
        }

    }
}

適用於RecyclerView

import android.content.Context
import android.text.Editable
import android.util.SparseArray
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.EditText
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView

abstract class BaseRecyclerAdapter<T>(private val list: MutableList<T>, private val mLayoutRes: Int): RecyclerView.Adapter<BaseRecyclerAdapter.ViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        return ViewHolder.getHolder(parent.context, mLayoutRes, parent)
    }

    override fun getItemCount(): Int {
        return list.size
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        onBindData(holder, list[position])
    }

    abstract fun onBindData(holder: ViewHolder, t: T)

    class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

        private var itemViews: SparseArray<View> = SparseArray()

        companion object {
            fun getHolder(context: Context, mLayoutRes: Int, parent: ViewGroup): ViewHolder {
                var holder: ViewHolder? = null
                if (holder == null) {
                    holder = ViewHolder(LayoutInflater.from(context).inflate(mLayoutRes, parent, false))
                }
                return holder
            }
        }

        @Suppress("UNCHECKED_CAST")
        private fun <T: View> getView(id: Int): T? {
            val view: View? = itemViews.get(id)
            var t: T? = null
            if (view != null) {
                t = view as T
            }
            if (t == null) {
                t = itemView.findViewById(id)
                itemViews.put(id, t)
            }
            return t
        }

        fun setText(id: Int, text: CharSequence): ViewHolder {
            val view: View = getView(id)!!
            if (view is TextView) {
                view.text = text
            } else if (view is EditText) {
                view.text = text as Editable?
            }
            return this
        }

        fun setOnClickListener(id: Int, listener: View.OnClickListener): ViewHolder {
            val view: View = getView(id)!!
            view.setOnClickListener(listener)
            return this
        }
    }
}

Android列表通用適配器Java版

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章