BindingAdapter因未知原因失去了绑定

时间:2019-01-22 06:15:00

标签: android data-binding kotlin android-viewmodel

绑定适配器已失去与视图模型的绑定。但是我不知道是什么原因。代码中的SpinnerTextView是一个Textview,它弹出一个警报对话框,用于从列表中选择值。设置标题会将Textview的文本设置为String值。绑定丢失,因为textview不显示新值,有什么解决方法吗?

我已经设置了一些断点,并且发现pickedQuantity =“ 0”可以正常工作,而且pickedQuantity.value = Quantitys.value !! [index]也已运行。但是,在BindingAdapter.kt中,只有pickedQuantity =“ 0”触发了setTitle函数。 因此,当我选择值时,我的TextView将始终显示0,但不会更改。

BindingAdapter.kt

@BindingAdapter("spinnerTitle")
fun<T> SpinnerTextView<T>.setTitle(str: String) {
    title = str
}

@BindingAdapter("spinnerAlertTitle")
fun<T> SpinnerTextView<T>.setAlertTitle(str: String) {
    alertTitle = str
}

@BindingAdapter("spinnerItems")
fun<T> SpinnerTextView<T>.setItems(list: List<T>) {
    items = list
}

@BindingAdapter("spinnerItemHandler")
fun<T> SpinnerTextView<T>.setHandler(handler: (Int) -> Unit) {
    valueChanged = handler
}

TicketTypeViewModel.kt

class TicketTypeViewModel : BaseViewModel() {
    val ticketId = MutableLiveData<Int>()
    val ticketName = MutableLiveData<String>()
    val ticketPrice = MutableLiveData<String>()
    val pickedQuantity = MutableLiveData<String>()
    val quantities = MutableLiveData<List<String>>()
    val spinnerTitle = MutableLiveData<String>()
    val spinnerHandler = MutableLiveData<(Int) -> Unit>()

    fun bind(ticket: TicketType, onClick: (Int) -> Unit) {
        ticketId.value = ticket.ticketTypeId
        ticketName.value = ticket.ticketTypeName
        ticketPrice.value = "$"  + ticket.price
        pickedQuantity.value = "0"
        spinnerTitle.value = ""
        val temp = mutableListOf<String>()
        for (i in 0 until ticket.quota) {
            temp.add(i.toString())
        }
        quantities.value = temp.toList()
        spinnerHandler.value = { index ->
            pickedQuantity.value = quantities.value!![index]
            onClick(index)
        }
    }
}

TicketTypeAdapter.kt

class TicketTypeAdapter(val onClick: (Int) -> Unit): RecyclerView.Adapter<TicketTypeAdapter.ViewHolder>() {

    private var ticketList: MutableList<TicketType> = mutableListOf()

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TicketTypeAdapter.ViewHolder {
        val binding: EventTicketTypeListItemBinding = DataBindingUtil.inflate(LayoutInflater.from(parent.context), R.layout.event_ticket_type_list_item, parent, false)
        return ViewHolder(binding, onClick)
    }

    override fun onBindViewHolder(holder: TicketTypeAdapter.ViewHolder, position: Int) {
        holder.bind(ticketList[position])
    }

    override fun getItemCount(): Int {
        return ticketList.size
    }

    fun refreshTicketList(ticketList: List<TicketType>){
        this.ticketList.clear()
        this.ticketList.addAll(ticketList)
        notifyDataSetChanged()
    }

    class ViewHolder(private val binding: EventTicketTypeListItemBinding, val onClick: (Int) -> Unit): RecyclerView.ViewHolder(binding.root){
        private val viewModel = TicketTypeViewModel()

        fun bind(ticket: TicketType){
            viewModel.bind(ticket, onClick)
            binding.ticketType = viewModel
        }
    }
}

在.xml

    <com.cityline.component.SpinnerTextView
        android:id="@+id/spinner_quantity"
        spinnerAlertTitle="@{ticketType.spinnerTitle}"
        spinnerItemHandler="@{ticketType.spinnerHandler}"
        spinnerItems="@{ticketType.quantities}"
        spinnerTitle="@{ticketType.pickedQuantity}"
        android:layout_width="20dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="20dp"
        android:background="@drawable/edit_text_bg_bottom_line"
        android:gravity="center"
        android:textSize="16sp" />

1 个答案:

答案 0 :(得分:0)

您缺少对binding.setLifecycleOwner(this)的呼叫

  

设置LifecycleOwner,用于观察以下内容的变化   LiveData在此绑定中。如果LiveData在绑定表达式之一中   并且未设置LifecycleOwner,将不会观察LiveData并对其进行更新   不会传播到用户界面。

因此,要么设置生命周期所有者,要么改用ObservableField,这更合适。

由于适配器在数据更新方面的工作方式不同,因此您可能希望将更改传播到适配器数据集,并调用notifyDataSetChanged()或类似的适配器来更新绑定。