Kotlin, Coroutines, Kodein and list for RecyclerView



我刚开始学习 Kotlin Android,我决定在我的第一个 Kotlin 应用程序 Coroutines 和 Kodein 库中使用。我的问题是返回在房间数据库中创建的对象列表。我知道如何为回收器视图设置简单的列表,但是我在通过协程设置回收器视图中的对象列表时遇到问题。

来自使用回收器视图的活动的函数:

private fun getCities() = launch(Dispatchers.Main) {
var locationList = addLocationViewModel.location.await()
locationList.observe(this@AddLocationActivity, Observer {
viewAdapter = LocationAdapter(locationList, this)
})
}

如您所见,LocationAdapter 中的第一个参数是 locationList,这个参数用红色下划线。错误意味着:

Type mismatch.
Required: kotlin.collections.ArrayList<Location>
Found: LiveData<List<Location>>

如何解决这个问题?

Adapter:
class LocationAdapter(
private val cities: ArrayList<Location>,
private val context: Context
) : RecyclerView.Adapter<LocationAdapter.LocationViewHolder>() {
private var removedPosition: Int = 0
private var removedItem: String = ""

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): LocationViewHolder {
val layoutInflater = LayoutInflater.from(context)
val contactRow = layoutInflater.inflate(R.layout.location_recyclerview_item, parent, false)
return LocationViewHolder(contactRow)
}
override fun getItemCount(): Int {
return cities.size
}
override fun onBindViewHolder(holder: LocationViewHolder, position: Int) {
val location = holder.view.location_text_view_item
location.text = cities.get(position).toString()
}
class LocationViewHolder(val view: View) : RecyclerView.ViewHolder(view)
fun removeItem(viewHolder: RecyclerView.ViewHolder) {
removedItem = viewHolder.adapterPosition.toString()
removedItem = cities[viewHolder.adapterPosition].toString()
cities.removeAt(viewHolder.adapterPosition)
notifyItemRemoved(viewHolder.adapterPosition)

}

}

视图模型:

class AddLocationViewModel(
private val locationRepository: LocationRepository
) : ViewModel() {
val location by lazyDeferred {
locationRepository.getAllLocations()
}
fun insertLocation(location: Location) {
locationRepository
}
}

错误本身不言自明,您的虚拟机返回类型为LiveData<List<Location>>的对象,

而不是将位置列表(即实时数据)对象直接传递给适配器,而是创建如下所示的lambda

private fun getCities() = launch(Dispatchers.Main) {
var locationList = addLocationViewModel.location.await()
locationList.observe(this@AddLocationActivity, Observer { 
locList -> viewAdapter = LocationAdapter(locList, this)
})
}

只需选取 LiveData 对象的值,如下所示:

viewAdapter = LocationAdapter(locationList.value!!, this)

最新更新