如何在ListView中使用数据绑定?

问题描述 投票:0回答:1

我正在像下面这样在我的布局中使用数据竞标到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
    }
}

有人知道吗?

android data-binding android-listview android-databinding
1个回答
0
投票

尝试如下更新您的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 = getItem(position)

        return binding.root
    }

    override fun getItem(position: Int): String? {
        return items[position]
    }

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


    fun submitList(items: List<ListItem>) {
        this.items = items
        notifyDataSetChanged()
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.