在调用notifydatasetchanged后,Recyclerview滚动到顶部

Nea*_*hal 3 android android-layout android-activity android-recyclerview

我有一个水平的recyclerview(使用LinearLayoutManager),它的子项目有一个包含在relativelayout中的imageview.recyclerview有三个包含子项的水平行.当滚动recyclelerview时,我正在使用http调用的响应更新数据集,并在http响应回调中调用notifydatasetChanged.如果recyclerview子项的高度和宽度是固定值(例如150dp,84dp),则recyclerview的行为与预期相同,即加载新项并保持在相同的滚动位置,但如果我将recyclerview的子项的高度和宽度设置为match_parent, wrap_content,recyclerview完全刷新并滚动到第一个位置.为什么会这样?注意:我在SO上检查了其他类似的问题,但没有一个提供可行的解决方案.

main_layout

<android.support.v7.widget.RecyclerView
    android:id="@+id/grid_recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginBottom="110dp"
    android:layout_marginLeft="15dp"
    android:layout_marginTop="80dp"
    android:background="@color/transparent"
    android:outlineProvider="bounds"
    android:elevation="8dp"
    android:padding="0dp"
    android:scrollbars="none" />
....
Run Code Online (Sandbox Code Playgroud)

recycler_view_child_item

<RelativeLayout      xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="0dp">
<ImageView
    android:id="@+id/thumbnail"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:adjustViewBounds="true"
    android:maxWidth="126dp"
    android:maxHeight="225dp"
    android:padding="0dp"/>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

mos*_*321 6

我遇到了同样的问题,无法在SO上找到解决方案.这个问题是由于没有设置造成LayoutManagerRecyclerView.我知道你说你有LinearLayoutManager.但请确保按以下方式设置它.(就我而言,我正在使用HorizontalGridView,但同样的原则适用RecyclerView).

horizontalGridView = (HorizontalGridView) findViewById(R.id.gridView);
GridElementAdapter adapter = newGridElementAdapter(VenueProfileActivity.this, mDeals);
horizontalGridView.setAdapter(adapter);

HorizontalGridView.LayoutManager layoutManager = new LinearLayoutManager(VenueProfileActivity.this, LinearLayoutManager.HORIZONTAL, false);
horizontalGridView.setLayoutManager(layoutManager);
horizontalGridView.setHasFixedSize(true);
Run Code Online (Sandbox Code Playgroud)