如何解决为什么数据绑定到RecyclerView中的前几项之前?
我正在尝试使用https://www.themoviedb.org/ API中的电视节目填充水平的回收站视图。
在我的片段中,我观察到了来自API的实时数据的更改,当更改时,我更新了回收者视图适配器。数据已更新,但是当我在设备上测试数据时,前几个列表项(在屏幕上可见可见)不会显示标题。只有在我向右滚动(以查看屏外项)然后向后滚动后,第一项才会以标题进行更新。
片段
class TelevisionSeriesFragment : Fragment() {
private lateinit var binding: FragmentTelevisionSeriesBinding
// lazily initialize the view model so that it's created the first time it is used
private val viewModel: TelevisionSeriesViewModel by lazy {
ViewModelProvider(this).get(TelevisionSeriesViewModel::class.java)
}
override fun onCreateView(
inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?
): View? {
binding = DataBindingUtil.inflate(inflater,R.layout.fragment_television_series,container,false)
// Allows Data Binding to Observe LiveData with the lifecycle of this Fragment
binding.lifecycleOwner = this
binding.viewModel = viewModel
configureRecyclerViews()
configureLiveDataObservers()
return binding.root
}
private fun configureRecyclerViews() {
binding.rvAiringToday.adapter = RVAdapter(viewModel.tvAiringToday.value)
}
private fun configureLiveDataObservers() {
viewModel.tvAiringToday.observe(viewLifecycleOwner,Observer { tvShowList ->
(binding.rvAiringToday.adapter as RVAdapter).updateData(tvShowList)
})
}
}
片段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"
xmlns:tools="http://schemas.android.com/tools"
xmlns:bind="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="viewModel"
type="io.github.fabiantauriello.moviecatalog.viewmodels.TelevisionSeriesViewModel" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".ui.TelevisionSeriesFragment"
android:id="@+id/linearLayout">
<TextView
android:id="@+id/tvLatest"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Latest"
android:textSize="30sp"
tools:layout_conversion_absoluteHeight="40dp"
tools:layout_editor_absoluteY="0dp"
tools:layout_editor_absoluteX="0dp"
tools:layout_conversion_absoluteWidth="84dp" />
<include
android:id="@+id/latest"
layout="@layout/list_item"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
bind:title="@{viewModel.tvLatest.title}"
tools:layout_conversion_absoluteHeight="80dp"
tools:layout_editor_absoluteY="40dp"
tools:layout_editor_absoluteX="0dp"
tools:layout_conversion_absoluteWidth="32dp" />
<TextView
android:id="@+id/tvAiringToday"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Airing Today"
android:textSize="30sp"
tools:layout_conversion_absoluteHeight="40dp"
tools:layout_editor_absoluteY="120dp"
tools:layout_editor_absoluteX="0dp"
tools:layout_conversion_absoluteWidth="166dp" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvAiringToday"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:layout_conversion_absoluteHeight="80dp"
tools:layout_conversion_absoluteWidth="411dp"
tools:layout_editor_absoluteX="0dp"
tools:layout_editor_absoluteY="161dp"
tools:listitem="@layout/list_item" />
</LinearLayout>
</layout>
列表项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="title"
type="String" />
</data>
<com.google.android.material.card.MaterialCardView
android:id="@+id/card"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:contentDescription="content description"
android:scaleType="centerCrop"
app:srcCompat="@drawable/ic_tv" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<!-- Title,secondary and supporting text -->
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{title}"
android:textAppearance="?attr/textAppearanceHeadline6"
android:textSize="18sp" />
</LinearLayout>
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
</layout>
适配器
class RVAdapter(
private var tvShows: List<TelevisionShow>?
) : RecyclerView.Adapter<RVAdapter.RVHolder>() {
class RVHolder(
val binding: ListItemBinding
) : RecyclerView.ViewHolder(binding.root)
// creates view holder
override fun onCreateViewHolder(parent: ViewGroup,viewType: Int): RVHolder {
val binding = DataBindingUtil.inflate<ListItemBinding>(
LayoutInflater.from(parent.context),R.layout.list_item,parent,false
)
return RVHolder(binding)
}
// binds data to view holder
override fun onBindViewHolder(holder: RVHolder,position: Int) {
holder.binding.title.text = tvShows?.get(position)?.title
}
override fun getItemCount() = tvShows?.size ?: 0
fun updateData(newTvShows: List<TelevisionShow>) {
tvShows = newTvShows
}
}
Viewmodel
class TelevisionSeriesViewModel : ViewModel() {
private val LOG_TAG = this::class.simpleName
private val repository = Repository()
private val _tvLatest = repository.tvLatest
val tvLatest: LiveData<TelevisionShow>
get() = _tvLatest
private val _tvAiringToday = repository.tvAiringToday
val tvAiringToday: LiveData<List<TelevisionShow>>
get() = _tvAiringToday
init {
repository.fetchTvData()
}
}
请帮助:)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。