在notifyDataSetChanged
上调用RecyclerView
时,它不会保留滚动位置并滚动到顶部,是否有任何解决方案可以保留滚动位置?
答案 0 :(得分:13)
如果您的RecyclerView列表项父项具有“wrap_content”属性,则Recyclerview会再次计算高度并向上滚动。
有两种解决方案:
layout_height="100dp"
像这样使用StaggeredGridLayoutManager:
mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.VERTICAL));
第二种解决方案效率更高,我建议使用
答案 1 :(得分:6)
不确定这是否解决了您的问题,但我遇到了同样的问题,因为我在通知后调用了setAdapter。因此,在通知解决问题后不调用setAdapter。
mAdapter.notifyItemRangeInserted(mAdapter.getItemCount(), list.size() - 1);
recyclerView.setAdapter(); // remove this line.
//Do this only when you're setting the data for the first time or when adapter is null.
答案 2 :(得分:1)
如果没有布局管理器,RecycleView将在notifyDataSetChanged
的任何变体上滚动回到顶部。以下是如何设置一个的示例。
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context, OrientationHelper.VERTICAL, false);
recycleView.setLayoutManager(linearLayoutManager);
//
答案 3 :(得分:1)
正如我猜测的那样,你正在做的是将适配器重置为RecyclerView
,然后调用notifyDataSetChanged().
您需要通过在适配器方法(如适配器dataList
)中传递dataList
,仅将update(dataList)
传递给适配器。
在此方法中,您可以将此列表分配给适配器列表,如;
public void update(ArrayList<Hashmap<String,String> list){
this.mList = list;
}
答案 4 :(得分:1)
就我而言,recyclerview是分页的。每次到达结尾并使用notifyItemInserted加载/插入项目时,recyclelerView用于滚动。以下为我工作:
recycler_view.stopScroll();
正如文件中所述:
停止正在进行的当前滚动,例如启动的滚动 smoothScrollBy(int,int),fling(int,int)或触发式投掷。
答案 5 :(得分:0)
您可以使用swapAdapter()并在通话notifyDataSetChange()后使用。这对我有用。
答案 6 :(得分:0)
notifyItemChanged() make the RecyclerView scroll and jump to UP
android:descendantFocusability="blocksDescendants"
Vertical RecyclerView内部的Horizontal RecyclerView通常会导致该问题,这是摆脱问题的最佳方法。不要将此属性放入水平的recyclerViews中,它只应位于父对象(垂直的RecyclerView)中。
答案 7 :(得分:0)
在父 recyclerView 中使用 android:descendantFocusability="blocksDescendants"
。它会解决这个问题。我在父 recyclerView 中有一个子 recyclerView,这个技巧帮助了我。此外,除了第一次,您应该始终在适配器上使用 notifyDataSetChanged。
答案 8 :(得分:-1)
如果不先设置适配器,就无法滚动到位置。即使您的列表为空,也请先设置适配器。获取数据时更新列表。然后调用adapter.notifydatasetchanged()方法。然后,您可以滚动到最后一个位置。让我知道这是否回答了您的问题,或者我是否必须回答-mmmcho