绑定适配器已失去与视图模型的绑定。但是我不知道是什么原因。代码中的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" />
答案 0 :(得分:0)
您缺少对binding.setLifecycleOwner(this)
的呼叫
设置
LifecycleOwner
,用于观察以下内容的变化LiveData
在此绑定中。如果LiveData
在绑定表达式之一中 并且未设置LifecycleOwner
,将不会观察LiveData
并对其进行更新 不会传播到用户界面。
因此,要么设置生命周期所有者,要么改用ObservableField
,这更合适。
由于适配器在数据更新方面的工作方式不同,因此您可能希望将更改传播到适配器数据集,并调用notifyDataSetChanged()
或类似的适配器来更新绑定。