RecyclerView仅在旋转屏幕后显示

用户672009

我遇到一个奇怪的问题。最初,我无法理解为什么我的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>

这里有人知道出什么问题了吗?

请让我知道我的代码的其他部分是否相关。

Zahra Sdg

不显示任何项目的问题是您的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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

FragmentPagerAdaper中的RecyclerView仅在旋转屏幕时更新

来自分类Dev

DrawerLayout旋转屏幕后不关闭

来自分类Dev

旋转屏幕后搜索到的文字消失

来自分类Dev

DrawerLayout旋转屏幕后不关闭

来自分类Dev

窗口仅在点击屏幕后出现

来自分类Dev

在NotifyDataSetChanged()之后RecyclerView不会更新,打开和关闭屏幕后内容会显示

来自分类Dev

快速旋转屏幕后如何获取视图的高度?

来自分类Dev

旋转屏幕后,OnSaveInstance和onRestoreInstance不起作用

来自分类Dev

旋转屏幕后,为什么Android重新启动活动?

来自分类Dev

ExoPlayer 在片段中旋转屏幕后重新创建

来自分类Dev

TableView 仅在屏幕旋转后更新

来自分类Dev

OpenGL程序仅显示屏幕后面的内容

来自分类Dev

OpenGL程序仅显示屏幕后面的内容

来自分类Dev

滚动到初始屏幕后显示引导导航栏

来自分类Dev

启动屏幕后显示当前的初始ViewController动画

来自分类Dev

再次打开屏幕后,MapView完全显示

来自分类Dev

推新屏幕后不显示默认后退按钮

来自分类Dev

不能保持屏幕旋转RecyclerView位置

来自分类Dev

在Android上旋转屏幕后,TableRow Text View内容错误

来自分类Dev

锁定屏幕后黑屏

来自分类Dev

锁定屏幕后黑屏

来自分类Dev

初始屏幕后,应用程序崩溃(应该显示菜单屏幕时)

来自分类Dev

横向显示WebView无需旋转屏幕

来自分类Dev

横向显示WebView而无需旋转屏幕

来自分类Dev

双显示器,旋转辅助屏幕

来自分类Dev

Swift 2:仅在全屏视频上旋转屏幕

来自分类Dev

lwjgl,仅在屏幕上旋转一个对象?

来自分类Dev

lwjgl,仅在屏幕上旋转一个对象?

来自分类Dev

VideoView 仅在我旋转屏幕时有效

Related 相关文章

热门标签

归档