android – 禁止在调用notifydatasetchanged后,Recyclerview滚动到顶部
时间: 2024-02-01 10:15:18 浏览: 186
在 RecyclerView 调用 `notifyDataSetChanged()` 后禁止自动滚动到顶部可以通过以下几种方法实现:
1. 使用 `notifyItemRangeChanged` 或者 `notifyItemRangeInserted` 等方法代替 `notifyDataSetChanged`,这样可以只刷新需要刷新的部分而不是整个 RecyclerView。
2. 在调用 `notifyDataSetChanged` 前记录当前 RecyclerView 的滚动位置,然后在刷新完成后再将 RecyclerView 滚动到之前的位置,可以使用如下代码实现:
```
int position = ((LinearLayoutManager)recyclerView.getLayoutManager()).findFirstVisibleItemPosition();
View firstVisibleView = recyclerView.getChildAt(0);
int top = firstVisibleView.getTop();
// 在更新数据之前记录当前滚动位置
adapter.notifyDataSetChanged();
// 在更新数据之后恢复滚动位置
((LinearLayoutManager)recyclerView.getLayoutManager()).scrollToPositionWithOffset(position, top);
```
3. 继承 `LinearLayoutManager`,重写 `onItemsChanged` 方法,这个方法在数据源发生变化时会被调用。在这个方法中判断是否需要滚动到顶部,可以使用如下代码实现:
```
public class CustomLinearLayoutManager extends LinearLayoutManager {
public CustomLinearLayoutManager(Context context) {
super(context);
}
public CustomLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
super(context, orientation, reverseLayout);
}
@Override
public void onItemsChanged(RecyclerView recyclerView) {
// 判断是否需要滚动到顶部
if (findFirstVisibleItemPosition() == 0) {
super.onItemsChanged(recyclerView);
}
}
}
```
只要在布局中使用 `CustomLinearLayoutManager` 代替原来的 `LinearLayoutManager` 即可。
阅读全文