在 kotlin 中,为什么我的 recyclerview 不滚动
in kotlin why is my recyclerview not scrolling
我是回收站视图的新手,刚开始使用 Room 数据库。我正在开发这个允许用户将记录输入 Room 数据库的应用程序。用户输入信息并存储。屏幕的顶部是数据输入,底部是显示记录的回收站视图。一切都很好,直到有足够的记录来填充可用 space。然后新记录就消失在屏幕下方。当用户尝试滚动时会出现动画,但项目不会移动。我试图通过添加填充使项目更大,奇怪的是现在有滚动,但只是滚动到之前显示的同一项目。
这是main.xml
<?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"
android:padding="10dp"
tools:context=".MainActivity">
<TextView
android:id="@+id/tvNameLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Name"
app:layout_constraintBottom_toBottomOf="@id/etName"
app:layout_constraintTop_toTopOf="@+id/etName"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@+id/etName"
/>
<EditText
android:id="@+id/etName"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:hint="Enter Name"
android:layout_marginStart="16dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toEndOf="@+id/tvNameLabel"/>
<TextView
android:id="@+id/tvEmailLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Email Id"
app:layout_constraintBottom_toBottomOf="@+id/etMailId"
app:layout_constraintEnd_toStartOf="@+id/etMailId"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/etName"/>
<EditText
android:id="@+id/etMailId"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:hint="Enter Email Id"
android:layout_marginStart="8dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/tvEmailLabel"
app:layout_constraintTop_toBottomOf="@+id/etName"/>
<Button
android:id="@+id/btnAdd"
android:layout_width="match_parent"
android:layout_marginTop="20dp"
android:layout_marginBottom="20dp"
android:layout_height="80dp"
android:text="ADD RECORD"
app:layout_constraintTop_toBottomOf="@+id/etMailId"/>
<TextView
android:id="@+id/tvName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:gravity="center"
android:text="All The Inserted Records"
android:textColor="@color/black"
android:textSize="18sp"
android:textStyle="bold"
app:layout_constraintTop_toBottomOf="@+id/btnAdd"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvItemsList"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/tvName"
android:visibility="visible"
tools:visibility="visible"
/>
<TextView
android:id="@+id/tvNoRecordsAvailable"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btnAdd"
android:gravity="center"
android:textSize="18sp"
android:textColor="#997b66"
android:text="There Are No records"
tools:visibility="visible"/>
</androidx.constraintlayout.widget.ConstraintLayout>
这是项目 xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/llMain"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical"
android:padding="20dp">
<TextView
android:id="@+id/tvName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/black"
android:textSize="16sp"
android:text="Name"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:layout_marginEnd="5dp"
android:textSize="18sp"
android:textStyle="bold"
android:text=":"/>
<TextView
android:id="@+id/tvEmail"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textColor="@color/black"
android:textSize="16sp"
android:text="Email"/>
<ImageView
android:id="@+id/ivEdit"
android:layout_width="50dp"
android:layout_height="50dp"
android:contentDescription="image"
android:foreground="?attr/selectableItemBackgroundBorderless"
android:scaleType="center"
android:src="@drawable/ic_action_edit"/>
<ImageView
android:id="@+id/ivDelete"
android:layout_width="50dp"
android:layout_height="50dp"
android:contentDescription="image"
android:foreground="?attr/selectableItemBackgroundBorderless"
android:scaleType="center"
android:src="@drawable/ic_action_delete"/>
</LinearLayout>
我不知道是否有其他文件是罪魁祸首;但我可以添加它们。
如有任何帮助,我们将不胜感激。
我认为你需要做两件事。
- 尝试使 main.xml 文件中的 Recycler View 在垂直方向上尽可能大。例如
android:layout_height="0dp"
- 我认为您应该向 Recycler View 添加约束。像
app:layout_constraintStart_toStartOf="parent"
和 app:layout_constraintEnd_toEndOf="parent"
将底部约束添加到回收器,然后 0dp 到高度
您的 RecyclerView
设置了 wrap_content
的高度 - 这使得小部件的大小足以显示其所有内容。它不需要滚动,因为它足够大,可以显示所有内容!
问题是您无法看到 整个小部件,因为它太高了,此时底部已超出屏幕范围。对于可滚动容器,您通常希望限制它们的高度(如果是水平滚动,则限制宽度)以便在内容中显示“window”。如果内容太大无法放入 window,容器将滚动到 window 后面。
在您的情况下,您可能希望将 RecyclerView
的底部限制在屏幕底部,或者可能是位于其下方的 TextView
的顶部:
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@id/tvName"
app:layout_constraintBottom_toBottomOf="parent"
定义列表占用的区域,作为 tvName
和布局底部之间的可用 space。 0dp
意味着它没有绝对高度,它的大小会适应那些垂直限制。你可以更聪明一点,但这是基本的想法 - 定义一个区域供你的列表使用,如果它的内容不够大,列表将滚动
我是回收站视图的新手,刚开始使用 Room 数据库。我正在开发这个允许用户将记录输入 Room 数据库的应用程序。用户输入信息并存储。屏幕的顶部是数据输入,底部是显示记录的回收站视图。一切都很好,直到有足够的记录来填充可用 space。然后新记录就消失在屏幕下方。当用户尝试滚动时会出现动画,但项目不会移动。我试图通过添加填充使项目更大,奇怪的是现在有滚动,但只是滚动到之前显示的同一项目。
这是main.xml
<?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"
android:padding="10dp"
tools:context=".MainActivity">
<TextView
android:id="@+id/tvNameLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Name"
app:layout_constraintBottom_toBottomOf="@id/etName"
app:layout_constraintTop_toTopOf="@+id/etName"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@+id/etName"
/>
<EditText
android:id="@+id/etName"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:hint="Enter Name"
android:layout_marginStart="16dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toEndOf="@+id/tvNameLabel"/>
<TextView
android:id="@+id/tvEmailLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Email Id"
app:layout_constraintBottom_toBottomOf="@+id/etMailId"
app:layout_constraintEnd_toStartOf="@+id/etMailId"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/etName"/>
<EditText
android:id="@+id/etMailId"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:hint="Enter Email Id"
android:layout_marginStart="8dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/tvEmailLabel"
app:layout_constraintTop_toBottomOf="@+id/etName"/>
<Button
android:id="@+id/btnAdd"
android:layout_width="match_parent"
android:layout_marginTop="20dp"
android:layout_marginBottom="20dp"
android:layout_height="80dp"
android:text="ADD RECORD"
app:layout_constraintTop_toBottomOf="@+id/etMailId"/>
<TextView
android:id="@+id/tvName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:gravity="center"
android:text="All The Inserted Records"
android:textColor="@color/black"
android:textSize="18sp"
android:textStyle="bold"
app:layout_constraintTop_toBottomOf="@+id/btnAdd"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvItemsList"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/tvName"
android:visibility="visible"
tools:visibility="visible"
/>
<TextView
android:id="@+id/tvNoRecordsAvailable"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btnAdd"
android:gravity="center"
android:textSize="18sp"
android:textColor="#997b66"
android:text="There Are No records"
tools:visibility="visible"/>
</androidx.constraintlayout.widget.ConstraintLayout>
这是项目 xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/llMain"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical"
android:padding="20dp">
<TextView
android:id="@+id/tvName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/black"
android:textSize="16sp"
android:text="Name"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:layout_marginEnd="5dp"
android:textSize="18sp"
android:textStyle="bold"
android:text=":"/>
<TextView
android:id="@+id/tvEmail"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textColor="@color/black"
android:textSize="16sp"
android:text="Email"/>
<ImageView
android:id="@+id/ivEdit"
android:layout_width="50dp"
android:layout_height="50dp"
android:contentDescription="image"
android:foreground="?attr/selectableItemBackgroundBorderless"
android:scaleType="center"
android:src="@drawable/ic_action_edit"/>
<ImageView
android:id="@+id/ivDelete"
android:layout_width="50dp"
android:layout_height="50dp"
android:contentDescription="image"
android:foreground="?attr/selectableItemBackgroundBorderless"
android:scaleType="center"
android:src="@drawable/ic_action_delete"/>
</LinearLayout>
我不知道是否有其他文件是罪魁祸首;但我可以添加它们。
如有任何帮助,我们将不胜感激。
我认为你需要做两件事。
- 尝试使 main.xml 文件中的 Recycler View 在垂直方向上尽可能大。例如
android:layout_height="0dp"
- 我认为您应该向 Recycler View 添加约束。像
app:layout_constraintStart_toStartOf="parent"
和app:layout_constraintEnd_toEndOf="parent"
将底部约束添加到回收器,然后 0dp 到高度
您的 RecyclerView
设置了 wrap_content
的高度 - 这使得小部件的大小足以显示其所有内容。它不需要滚动,因为它足够大,可以显示所有内容!
问题是您无法看到 整个小部件,因为它太高了,此时底部已超出屏幕范围。对于可滚动容器,您通常希望限制它们的高度(如果是水平滚动,则限制宽度)以便在内容中显示“window”。如果内容太大无法放入 window,容器将滚动到 window 后面。
在您的情况下,您可能希望将 RecyclerView
的底部限制在屏幕底部,或者可能是位于其下方的 TextView
的顶部:
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@id/tvName"
app:layout_constraintBottom_toBottomOf="parent"
定义列表占用的区域,作为 tvName
和布局底部之间的可用 space。 0dp
意味着它没有绝对高度,它的大小会适应那些垂直限制。你可以更聪明一点,但这是基本的想法 - 定义一个区域供你的列表使用,如果它的内容不够大,列表将滚动