android - 使用数据绑定时,recyclerview 不显示任何内容
问题描述
我现在正在使用数据绑定。当我使用数据绑定为 recyclerview 充气时,没有项目。登录适配器也没有显示任何内容。但是当不使用数据绑定时,我可以显示我想要的结果。我不明白为什么使用数据绑定没有显示任何内容。如下所示,viewDataBinding 是数据绑定变量。如果我使用这个变量,结果不会显示。但如果我使用排除它,结果显示正确。
xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="viewmodel"
type="com.haii.schedulemanager.schedule.ScheduleViewModel" />
</data>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/scheduleListView"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="Main fragment"
android:textSize="24sp"
android:visibility="gone" />
</FrameLayout>
</layout>
分段
class ScheduleFragment : DaggerFragment() {
@Inject
lateinit var viewModelFactory: ViewModelProvider.Factory
private val viewModel by viewModels<ScheduleViewModel> { viewModelFactory }
private lateinit var viewDataBinding: FragmentScheduleBinding
private var itemList = listOf<ScheduleItem>()
private lateinit var scheduleAdapter: ScheduleAdapter
private lateinit var manager : RecyclerView.LayoutManager
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.fragment_schedule, container, false)
viewDataBinding = FragmentScheduleBinding.inflate(inflater, container, false).apply {
viewmodel = viewModel
}
return view
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewDataBinding.lifecycleOwner = this.viewLifecycleOwner
manager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
scheduleAdapter = ScheduleAdapter()
viewDataBinding.scheduleListView.layoutManager = manager
viewDataBinding.scheduleListView.adapter = scheduleAdapter
init()
viewModel.getWeek()
}
private fun init(){
viewModel.item.observe(this, Observer{
itemList = it
scheduleAdapter.removeItems()
scheduleAdapter.addItems(itemList)
viewDataBinding.scheduleListView.adapter?.notifyDataSetChanged()
})
}
}
适配器
class ScheduleAdapter() : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
lateinit var view : View
var itemList = arrayListOf<ScheduleItem>()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val inflater = parent.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
if(viewType == HEADER_TYPE){
view = inflater.inflate(R.layout.schedule_header,parent,false)
return HeaderViewHolder(view)
}
else if(viewType == ITEM_TYPE){
view = inflater.inflate(R.layout.schedule_item,parent,false)
return ItemViewHolder(view)
}else{
return HeaderViewHolder(view)
}
}
override fun getItemCount(): Int = itemList.size
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
if(holder is HeaderViewHolder){
holder.startDay.text = itemList.get(position).startDay
}
else if(holder is ItemViewHolder){
holder.time.text = itemList.get(position).startTime+"~"+itemList.get(position).endTime
holder.title.text = itemList.get(position).title
holder.participant.text = itemList.get(position).participant
holder.title.text = itemList.get(position).title
}
}
class HeaderViewHolder internal constructor(itemView: View) :
RecyclerView.ViewHolder(itemView) {
var startDay: TextView
init {
startDay = itemView.findViewById(R.id.startDay)
}
}
class ItemViewHolder internal constructor(itemView: View) :
RecyclerView.ViewHolder(itemView) {
var time: TextView
var title: TextView
var participant: TextView
var place: TextView
init {
time = itemView.findViewById(R.id.time)
title = itemView.findViewById(R.id.title)
participant = itemView.findViewById(R.id.participant)
place = itemView.findViewById(R.id.place)
}
}
override fun getItemViewType(position: Int): Int {
return itemList.get(position).viewType
}
override fun getItemId(position: Int): Long {
return itemList.get(position).id.toLong()
}
fun addItems(item : List<ScheduleItem>){
itemList.addAll(item)
}
fun removeItems(){
itemList.clear()
}
}
解决方案
推荐阅读
- oracle - 执行长时间运行的查询时,如何避免 Oracle APEX 5.1 中的 Bad Gateway 超时?
- flutter - 为 Flutter App 添加高级功能
- maven - pom.xml 每次添加新依赖时都会出错
- vb.net - 使用 vb.net (2010) 在网格/表中显示数据库记录
- c# - 获取类的类型时出现问题
- timestamp - 如何将 Erlang:timestamp() 转换为正常的日期格式?
- node.js - 如果在多个项目中使用,如何集中数据库模型文件夹?
- apache-kafka - Kafka 和微服务 - 架构问题
- amazon-web-services - 有谁知道我在哪里可以找到适用于 aws/codebuild/nodejs:10.1.0 的 DockerFIle?
- amp-html - 如何使用 AMP 加载内容?