RecyclerView notifyDataSetChanged滚动到顶部位置

时间:2015-03-11 17:40:26

标签: android android-appcompat android-recyclerview

notifyDataSetChanged上调用RecyclerView时,它不会保留滚动位置并滚动到顶部,是否有任何解决方案可以保留滚动位置?

9 个答案:

答案 0 :(得分:13)

如果您的RecyclerView列表项父项具有“wrap_content”属性,则Recyclerview会再次计算高度并向上滚动。

有两种解决方案:

  1. 将您的身高设置为常数,如下所示:layout_height="100dp"
  2. 像这样使用StaggeredGridLayoutManager:

    mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.VERTICAL));

  3. 第二种解决方案效率更高,我建议使用

答案 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内部的Horizo​​ntal RecyclerView通常会导致该问题,这是摆脱问题的最佳方法。不要将此属性放入水平的recyclerViews中,它只应位于父对象(垂直的RecyclerView)中。

答案 7 :(得分:0)

在父 recyclerView 中使用 android:descendantFocusability="blocksDescendants"。它会解决这个问题。我在父 recyclerView 中有一个子 recyclerView,这个技巧帮助了我。此外,除了第一次,您应该始终在适配器上使用 notifyDataSetChanged。

答案 8 :(得分:-1)

如果不先设置适配器,就无法滚动到位置。即使您的列表为空,也请先设置适配器。获取数据时更新列表。然后调用adapter.notifydatasetchanged()方法。然后,您可以滚动到最后一个位置。让我知道这是否回答了您的问题,或者我是否必须回答-mmmcho