適用於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
}
}
}