为什么 Recyclerview 从列表的一半开始滚动 up/down?
Why Recyclerview start scrolling up/down from half of the list?
实际上,我正在更新 "RecylerView" 基于过滤数据列表的列表适配器。当我更新适配器数据已成功更新但滚动从适配器列表的一半开始时。
有人遇到过这样的问题吗?
我已经尝试过的东西
- 将 Recyclerview 放在 RelativeLayout 中
- 将 Recyclerview 高度设置为 wrap_content
- 使用 requestLayout 方法
<?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">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/spinnerLayout"
android:layout_width="match_parent"
android:layout_height="@dimen/dp45"
android:background="@color/black_color"
android:orientation="horizontal"
android:paddingStart="@dimen/dp10"
android:paddingEnd="@dimen/dp10"
android:weightSum="2">
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="start|center"
android:text="@string/statement_type"
android:textAllCaps="true"
android:textColor="@color/colorAccent"
android:textSize="@dimen/subtitle"
android:textStyle="bold"
app:fontFamily="@string/fontBold" />
<androidx.appcompat.widget.AppCompatSpinner
android:id="@+id/filterItemSpinner"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1" />
</androidx.appcompat.widget.LinearLayoutCompat>
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/contentLayout"
android:layout_width="match_parent"
android:layout_height="@dimen/dp45"
android:layout_below="@+id/spinnerLayout"
android:background="@color/colorAccent"
android:orientation="horizontal"
android:padding="@dimen/dp10"
android:weightSum="3">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/txtdate"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="0.8"
android:gravity="start|center"
android:text="@string/lbl_date_particular"
android:textAllCaps="true"
android:textColor="@color/black_color"
android:textSize="@dimen/bodyText"
android:textStyle="bold" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/txtdr_cr"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1.2"
android:gravity="center"
android:text="@string/lbl_dr_cr"
android:textAllCaps="true"
android:textColor="@color/black_color"
android:textSize="@dimen/bodyText"
android:textStyle="bold" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/txtbalance"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center|end"
android:text="@string/balance"
android:textAllCaps="true"
android:textColor="@color/black_color"
android:textSize="@dimen/bodyText"
android:textStyle="bold" />
</androidx.appcompat.widget.LinearLayoutCompat>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/contentLayout"
tools:listitem="@layout/item_account_statement" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/txtEmptyView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true"
android:layout_gravity="center"
android:gravity="center"
android:text="@string/no_acc_statement_available"
android:textAlignment="center"
android:textColor="@color/colorPrimary"
android:textSize="@dimen/sp18"
android:visibility="gone" />
<include
android:id="@+id/includeLoaderLine"
layout="@layout/custom_loaderview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true" />
</RelativeLayout>
</layout>
您可以收听适配器更新并在检测到更改时将 RecyclerView
滚动到起始位置。
如果您正在使用 Java:
//Initializing your adapter
MyAdapter myAdapter = new MyAdapter(...);
//Listening to adapter updates
myAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
@Override
public void onChanged() {
//Scrolling to starting position
recyclerView.getLayoutManager().scrollToPosition(0);
}
});
//Setting your adapter on your RecyclerView
myRecyclerView.setAdapter(myAdapter);
...
如果您使用的是 Kotlin:
//Initializing your adapter
var myAdapter = MyAdapter(...)
//Listening to adapter updates
myAdapter.registerAdapterDataObserver(object :
RecyclerView.AdapterDataObserver() {
override fun onChanged() {
//Scrolling to starting position
myRecyclerView.layoutManager.scrollToPosition(0)
}
})
//Setting your adapter on your RecyclerView
myRecyclerView.adapter = myAdapter
...
希望对您有所帮助! =)
实际上,我正在更新 "RecylerView" 基于过滤数据列表的列表适配器。当我更新适配器数据已成功更新但滚动从适配器列表的一半开始时。 有人遇到过这样的问题吗?
我已经尝试过的东西 - 将 Recyclerview 放在 RelativeLayout 中 - 将 Recyclerview 高度设置为 wrap_content - 使用 requestLayout 方法
<?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">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/spinnerLayout"
android:layout_width="match_parent"
android:layout_height="@dimen/dp45"
android:background="@color/black_color"
android:orientation="horizontal"
android:paddingStart="@dimen/dp10"
android:paddingEnd="@dimen/dp10"
android:weightSum="2">
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="start|center"
android:text="@string/statement_type"
android:textAllCaps="true"
android:textColor="@color/colorAccent"
android:textSize="@dimen/subtitle"
android:textStyle="bold"
app:fontFamily="@string/fontBold" />
<androidx.appcompat.widget.AppCompatSpinner
android:id="@+id/filterItemSpinner"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1" />
</androidx.appcompat.widget.LinearLayoutCompat>
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/contentLayout"
android:layout_width="match_parent"
android:layout_height="@dimen/dp45"
android:layout_below="@+id/spinnerLayout"
android:background="@color/colorAccent"
android:orientation="horizontal"
android:padding="@dimen/dp10"
android:weightSum="3">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/txtdate"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="0.8"
android:gravity="start|center"
android:text="@string/lbl_date_particular"
android:textAllCaps="true"
android:textColor="@color/black_color"
android:textSize="@dimen/bodyText"
android:textStyle="bold" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/txtdr_cr"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1.2"
android:gravity="center"
android:text="@string/lbl_dr_cr"
android:textAllCaps="true"
android:textColor="@color/black_color"
android:textSize="@dimen/bodyText"
android:textStyle="bold" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/txtbalance"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center|end"
android:text="@string/balance"
android:textAllCaps="true"
android:textColor="@color/black_color"
android:textSize="@dimen/bodyText"
android:textStyle="bold" />
</androidx.appcompat.widget.LinearLayoutCompat>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/contentLayout"
tools:listitem="@layout/item_account_statement" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/txtEmptyView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true"
android:layout_gravity="center"
android:gravity="center"
android:text="@string/no_acc_statement_available"
android:textAlignment="center"
android:textColor="@color/colorPrimary"
android:textSize="@dimen/sp18"
android:visibility="gone" />
<include
android:id="@+id/includeLoaderLine"
layout="@layout/custom_loaderview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true" />
</RelativeLayout>
</layout>
您可以收听适配器更新并在检测到更改时将 RecyclerView
滚动到起始位置。
如果您正在使用 Java:
//Initializing your adapter
MyAdapter myAdapter = new MyAdapter(...);
//Listening to adapter updates
myAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
@Override
public void onChanged() {
//Scrolling to starting position
recyclerView.getLayoutManager().scrollToPosition(0);
}
});
//Setting your adapter on your RecyclerView
myRecyclerView.setAdapter(myAdapter);
...
如果您使用的是 Kotlin:
//Initializing your adapter
var myAdapter = MyAdapter(...)
//Listening to adapter updates
myAdapter.registerAdapterDataObserver(object :
RecyclerView.AdapterDataObserver() {
override fun onChanged() {
//Scrolling to starting position
myRecyclerView.layoutManager.scrollToPosition(0)
}
})
//Setting your adapter on your RecyclerView
myRecyclerView.adapter = myAdapter
...
希望对您有所帮助! =)