我遇到一个奇怪的问题。最初,我无法理解为什么我的RecyclerView没有显示。但是在我的物理设备上安装后,很明显,旋转屏幕后视图显示的很好。旋转一圈后,该视图将可见并正常运行。
我的片段
class InjuriesFragment : Fragment(R.layout.fragment_injuries) {
private val injuriesViewModel: InjuriesViewModel by viewModel()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
injuriesViewModel.update()
injuriesList.layoutManager = LinearLayoutManager(context)
injuriesList.setHasFixedSize(true)
val adapter = InjuriesAdapter {
Toast.makeText(context, "$it", Toast.LENGTH_SHORT).show()
}
injuriesList.adapter = adapter
injuriesViewModel.injuries.observe(viewLifecycleOwner) {
val injuries = it.map { it.injury }
adapter.submitList(injuries)
}
}
}
视图模型
class InjuriesViewModel(private val repository: InjuryRepository) : ViewModel() {
val injuries: LiveData<List<InjuryWithTags>> = liveData {
emitSource(repository.findAll())
}
fun update() {
viewModelScope.launch(IO) {
repository.update()
}
}
}
适配器
class InjuriesAdapter(private val onItemClickListener: (Injury) -> Unit) : ListAdapter<Injury, InjuriesAdapter.InjuryHolder>(DIFF_CALLBACK) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): InjuryHolder {
val itemView = LayoutInflater.from(parent.context).inflate(R.layout.injury_item, parent, false)
return InjuryHolder(itemView)
}
override fun onBindViewHolder(holder: InjuryHolder, position: Int) {
val injury = getItem(position)
holder.occurredAt.text = injury.occurredAt.toString()
holder.description.text = injury.description
}
inner class InjuryHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val occurredAt: TextView = itemView.occurredAt
val description: TextView = itemView.description
init {
itemView.setOnClickListener {
if(adapterPosition != NO_POSITION) {
onItemClickListener(getItem(adapterPosition))
}
}
}
}
companion object {
val DIFF_CALLBACK = object : DiffUtil.ItemCallback<Injury>() {
override fun areItemsTheSame(oldItem: Injury, newItem: Injury) = oldItem.id == newItem.id
override fun areContentsTheSame(oldItem: Injury, newItem: Injury) = oldItem.occurredAt == newItem.occurredAt
&& oldItem.description == newItem.description
}
}
}
布局
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.InjuriesFragment">
<AutoCompleteTextView
android:id="@+id/textviewSearch"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Filter by tags..."
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textviewTags"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/hello_first_fragment"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/textviewSearch" />
<!--
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/injuriesList"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textviewTags"
tools:listitem="@layout/injury_item" />
-->
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fillViewport="true"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/textviewTags">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/injuriesList"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:listitem="@layout/injury_item" />
</ScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>
这里有人知道出什么问题了吗?
请让我知道我的代码的其他部分是否相关。
不显示任何项目的问题是您的RecyclerView是wrap_content并且没有底部约束。在测量视图后,将填充RecyclerView项目。因此视图仍为0dp宽度。因此,在ConstraintLayout中使用RecyclerView时,应将所有约束添加到布局中。在这种情况下,添加项目后,RecyclerView可以由于约束属性而知道其宽度。它与屏幕旋转无关。
尽管没有必要将RecyclerView放置在ScrollView中。
将您的布局更改为此:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.InjuriesFragment">
<AutoCompleteTextView
android:id="@+id/textviewSearch"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Filter by tags..."
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toTopOf="@id/textviewTags"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textviewTags"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/hello_first_fragment"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toTopOf="@id/injuriesList"
app:layout_constraintTop_toBottomOf="@id/textviewSearch" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/injuriesList"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/textviewTags"
app:layout_constraintBottom_toBottomOf="parent"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/injury_item"/>
</androidx.constraintlayout.widget.ConstraintLayout>
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句