Как использовать DataBinding в ListView?

Я использую данные в RecyclerView в моем макете, как показано ниже:

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/topup_list"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:items="@{viewModel.items}"
            tools:listitem="@layout/list_item_content" />

и список и обязательные адаптеры, такие как:

@BindingAdapter("app:items")
fun setItems(listView: RecyclerView, items: List<ListItem>?) {
    items?.let {
        (listView.adapter as MyListAdapter).submitList(items)
    }
}

//------------------

class MyListAdapter() :
    ListAdapter<ListItem, ViewHolder>(myListItemDiffCallback()) {

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bind(getItem(position))
    }

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

    class ViewHolder private constructor(private val binding: ListItemContentBinding) :
        RecyclerView.ViewHolder(binding.root) {

        fun bind(item: ListItem) {

            binding.item = item
            binding.executePendingBindings()
        }

        companion object {

            fun from(parent: ViewGroup): ViewHolder {

                val layoutInflater = LayoutInflater.from(parent.context)
                val binding = TopUpListItemContentBinding.inflate(layoutInflater, parent, false)

                return ViewHolder(binding)
            }
        }
    }
}

class myListItemDiffCallback : DiffUtil.ItemCallback<ListItem>() {

    override fun areItemsTheSame(oldItem: ListItem, newItem: ListItem): Boolean {
        return oldItem.label == newItem.label
    }

    override fun areContentsTheSame(
        oldItem: ListItem,
        newItem: ListItem
    ): Boolean {
        return oldItem == newItem
    }
}

Но это не тот случай, когда используется простой ListView. По многим причинам я предпочитаю использовать просмотр списка, и я пытался, но я не знаю, как настроить свой адаптер для привязки данных, как я использовал в RecycleView.

Ниже мой адаптер для Listview:

class MyListAdapter(context: Context, items: List<ListItem>) :
    ArrayAdapter<ListItem>(context, 0, items) {

    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {

        val binding = ListItemContentBinding.inflate(
            LayoutInflater.from(parent.context),
            parent,
            false
        )

        binding.item = getItem(position)

        return binding.root
    }
}

Мой предмет класса Модель:

data class ListItem(
    val iconResId: Int,
    val label: String,
    val action: () -> Unit
)

У кого-нибудь есть подсказка?

Всего 1 ответ


Попробуйте обновить ваш adapter как adapter ниже:

class MyListAdapter(context: Context, var items: List<ListItem> = arrayListOf()) :
    ArrayAdapter<ListItem>(context, 0, items) {

    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {

        val binding = ListItemContentBinding.inflate(
            LayoutInflater.from(parent.context),
            parent,
            false
        )

        binding.item = items[position]

        return binding.root
    }

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


    fun submitList(items: List<ListItem>) {
        this.items = items
        notifyDataSetChanged()
    }
}

Есть идеи?

10000