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 BaseMultiViewRecyclerAdapter(
private val list: MutableList) :
RecyclerView.Adapter() {
abstract fun getViewHolder(parent: ViewGroup, viewType: Int) : ViewHolder
abstract fun onBindData(holder: ViewHolder, t: T, position: Int)
abstract fun getViewType(position: Int) : Int
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return getViewHolder(parent, viewType)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
onBindData(holder, list[position], position)
}
override fun getItemCount(): Int {
return list.size
}
override fun getItemViewType(position: Int): Int {
return getViewType(position)
}
class ViewHolder(mLayoutRes: Int, parent: ViewGroup) :
RecyclerView.ViewHolder(
LayoutInflater.from(parent.context)
.inflate(mLayoutRes, parent, false)) {
private var itemViews: SparseArray = SparseArray()
@Suppress("UNCHECKED_CAST")
private fun 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
}
}
}
使用
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.ViewGroup
import androidx.recyclerview.widget.LinearLayoutManager
import com.jack.jlib.adapter.BaseMultiViewRecyclerAdapter
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
private lateinit var adapter: BaseMultiViewRecyclerAdapter>
private val list: MutableList> = ArrayList()
companion object {
const val VIEW_TYPE_ONE = 0x001
const val VIEW_TYPE_TWO = 0x002
const val VIEW_TYPE_THREE = 0x003
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var map: MutableMap = HashMap()
map["name"] = "Jack"
map["position"] = "left"
list.add(map)
map = HashMap()
map["name"] = "Tom"
map["position"] = "right"
list.add(map)
map = HashMap()
map["name"] = "Jackson"
map["position"] = "right"
list.add(map)
map = HashMap()
map["name"] = "Lucy"
map["position"] = "right"
list.add(map)
map = HashMap()
map["name"] = "Lily"
map["position"] = "left"
list.add(map)
map = HashMap()
map["name"] = "Jerry"
map["position"] = "right"
list.add(map)
map = HashMap()
map["name"] = "张三"
map["position"] = "center"
list.add(map)
map = HashMap()
map["name"] = "李四"
map["position"] = "center"
list.add(map)
map = HashMap()
map["name"] = "Nancy"
map["position"] = "left"
list.add(map)
println("List Size: ${list.size}")
adapter = object : BaseMultiViewRecyclerAdapter>(list) {
override fun onBindData(
holder: ViewHolder,
t: MutableMap,
position: Int
) {
when {
"left" == t["position"].toString() -> {
holder.setText(R.id.text_view_one, t["name"].toString())
}
"right" == t["position"].toString() -> {
holder.setText(R.id.text_view_two, t["name"].toString())
}
else -> {
holder.setText(R.id.text_view_three, t["name"].toString())
}
}
}
override fun getViewType(position: Int): Int {
return when {
list[position]["position"] == "left" -> {
VIEW_TYPE_ONE
}
list[position]["position"] == "right" -> {
VIEW_TYPE_TWO
}
else -> {
VIEW_TYPE_THREE
}
}
}
override fun getViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return when (viewType) {
VIEW_TYPE_ONE -> {
ViewHolder(R.layout.item_one, parent)
}
VIEW_TYPE_TWO -> {
ViewHolder(R.layout.item_two, parent)
}
else -> {
ViewHolder(R.layout.item_three, parent)
}
}
}
}
recycler_view.adapter = adapter
recycler_view.layoutManager = LinearLayoutManager(applicationContext)
}
}