如何设置适配器以获取不同的对象数组?
How to set adapter to get different object array?
我有一个 recyclerview 的布局,但我想尝试一下适配器可以接收多个数组对象。
例子
var array1 : Arraylist<ObjectA>
var array2 : Arraylist<ObjectB>
fun foo1(){
recyclerview.setAdapter(MainAdapter(array1))
}
fun foo2(){
recyclerview.setAdapter(MainAdapter(array2))
}
如何设置 Main Adapter
来接收不同的数组?因为 recyclerview 使用相同的布局,相同的列表项但不同的数据。或者我应该继续使用 2 个不同的适配器?
我使用的是通用 class 适配器,但我不知道如何正确创建通用 class?
一个适配器就够了。
class MainAdapter : BaseAdapter() {
private var dataSourceA: Arraylist<ObjectA> = ArrayList()
private var dataSourceB: Arraylist<ObjectB> = ArrayList()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindingHolder {
return if (viewType == ITEM_A) {
generateBindingHolder(R.layout.list_item_a, parent)
} else {
generateBindingHolder(R.layout.list_item_b, parent)
}
}
override fun getItemCount() = dataSourceA.size + dataSourceB.size
override fun getItemViewType(position: Int): Int {
return if (position < dataSourceA.size) ITEM_A else ITEM_B
}
override fun onBindViewHolder(holder: BindingHolder, position: Int) {
// check holder' s type
when (holder.binding) {
is ListItemABinding -> {
holder.myBind(holder.binding) {
// add a' s listener
}
}
else -> {
holder.myBind(holder.binding) {
// add b' s listener
}
}
}
}
fun setDataSourceA(data: Arraylist<ObjectA>) {
dataSourceA = data
}
fun setDataSourceB(data: Arraylist<ObjectB>) {
dataSourceB = data
}
...
}
val adapter = MainAdapter()
recyclerview.setAdapter(adapter)
adapter.setDataSourceA(array1)
adapter.setDataSourceB(array2)
adapter.notifyDataSetChanged()
abstract class BaseAdapter : RecyclerView.Adapter<BaseAdapter.BindingHolder>() {
class BindingHolder(val binding: ViewDataBinding) : RecyclerView.ViewHolder(binding.root) {
fun <T : ViewDataBinding> myBind(receiver: T, block: T.() -> Unit) {
receiver.block()
receiver.executePendingBindings()
}
}
companion object {
fun generateBindingHolder(@LayoutRes layoutRes: Int, parent: ViewGroup): BindingHolder {
return BindingHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), layoutRes, parent, false))
}
}
}
我有一个 recyclerview 的布局,但我想尝试一下适配器可以接收多个数组对象。
例子
var array1 : Arraylist<ObjectA>
var array2 : Arraylist<ObjectB>
fun foo1(){
recyclerview.setAdapter(MainAdapter(array1))
}
fun foo2(){
recyclerview.setAdapter(MainAdapter(array2))
}
如何设置 Main Adapter
来接收不同的数组?因为 recyclerview 使用相同的布局,相同的列表项但不同的数据。或者我应该继续使用 2 个不同的适配器?
我使用的是通用 class 适配器,但我不知道如何正确创建通用 class?
一个适配器就够了。
class MainAdapter : BaseAdapter() {
private var dataSourceA: Arraylist<ObjectA> = ArrayList()
private var dataSourceB: Arraylist<ObjectB> = ArrayList()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindingHolder {
return if (viewType == ITEM_A) {
generateBindingHolder(R.layout.list_item_a, parent)
} else {
generateBindingHolder(R.layout.list_item_b, parent)
}
}
override fun getItemCount() = dataSourceA.size + dataSourceB.size
override fun getItemViewType(position: Int): Int {
return if (position < dataSourceA.size) ITEM_A else ITEM_B
}
override fun onBindViewHolder(holder: BindingHolder, position: Int) {
// check holder' s type
when (holder.binding) {
is ListItemABinding -> {
holder.myBind(holder.binding) {
// add a' s listener
}
}
else -> {
holder.myBind(holder.binding) {
// add b' s listener
}
}
}
}
fun setDataSourceA(data: Arraylist<ObjectA>) {
dataSourceA = data
}
fun setDataSourceB(data: Arraylist<ObjectB>) {
dataSourceB = data
}
...
}
val adapter = MainAdapter()
recyclerview.setAdapter(adapter)
adapter.setDataSourceA(array1)
adapter.setDataSourceB(array2)
adapter.notifyDataSetChanged()
abstract class BaseAdapter : RecyclerView.Adapter<BaseAdapter.BindingHolder>() {
class BindingHolder(val binding: ViewDataBinding) : RecyclerView.ViewHolder(binding.root) {
fun <T : ViewDataBinding> myBind(receiver: T, block: T.() -> Unit) {
receiver.block()
receiver.executePendingBindings()
}
}
companion object {
fun generateBindingHolder(@LayoutRes layoutRes: Int, parent: ViewGroup): BindingHolder {
return BindingHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), layoutRes, parent, false))
}
}
}