加载数据时,RecyclerView会滚动到底部

时间:2017-12-11 17:20:47

标签: android android-recyclerview

我与RecyclerView有一些奇怪的问题,因为我更改了我的应用程序以从Room数据库加载数据。

我有一个屏幕(Fragment),显示用户的个人资料。基本上它是GridLayout,第一项(行)显示有关用户的一些信息,然后每行显示三个图像。

RecyclerView的代码是:

private void initializeRecyclerView() {
    if (listAdapter == null) {
        listAdapter = new PhotosListAdapter(getActivity(), userProfileAccountId, false);
    }

    rvPhotosList.setNestedScrollingEnabled(true);
    rvPhotosList.getItemAnimator().setChangeDuration(0);

    GridLayoutManager layoutManager = new GridLayoutManager(getContext(), ProfileFragment.GRID_COLUMNS,
            LinearLayoutManager.VERTICAL, false);

    layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
        @Override
        public int getSpanSize(int position) {
            // 3 spans for Header, 1 for photos
            return listAdapter.isHeader(position) ? 3 : 1;
        }
    });

    rvPhotosList.setLayoutManager(layoutManager);

    int spacingInPixels = 1dp;
    rvPhotosList.addItemDecoration(new PaddingItemDecoration(GRID_COLUMNS, spacingInPixels, true));

    rvPhotosList.setAdapter(listAdapter);
}

这就是我加载数据的方式:

    compositeDisposable.add(
        repository.getAccount(accountId)
            .doOnNext(account -> {
                if (account != null && view != null) {
                    view.showCover(account.getCover());
                    view.showAccount(account);
                }
            })
            .flatMap(s -> repository.getUserPosts(accountId))
            .subscribe(posts -> {
                if (view != null) {
                    view.showPosts(posts);
                }
            }, throwable -> {}));

两个调用都返回FlowableFlowable<Account>Flowable<Post> AccountPost是Room的实体类。 两个方法showAccount()showPosts()将前面提到的实体类传递给适配器。

问题是:数据加载的那一刻它会滚动到屏幕的底部(这也是RecyclerView的底部)。

我不确定为什么会这样。是因为Room的Flowable类型吗?因为之前当我从网络获取数据并将它们传递给适配器时我没有遇到这个问题。

编辑:我正在使用版本25.3.1进行RecyclerView

编辑2:这是我使用AccountPost数据更新我的适配器类的方式:

public void addPhotos(List<Post> posts) {
    dataset.addAll(posts);
    notifyDataSetChanged();
}

public void addProfileItem(Account account) {
    this.account = account;
    notifyItemInserted(0);
}

2 个答案:

答案 0 :(得分:16)

你尝试过这个吗?将父descendantFocusability的{​​{1}}属性设置为 blockDescendants

这样做,它将不再关注回收器视图中动态加载的子视图,因此不会发生自动滚动。

RecyclerView

注意:属性 android:descendantFocusability="blocksDescendants" 可以与其他视图一起使用,例如FrameLayout,RelativeLayout等。因此,如果将此属性设置为父/根布局,则不会更多滚动到底部。

答案 1 :(得分:1)

在我看来,这是罪魁祸首,

GridLayoutManager gridLayoutManager = new GridLayoutManager(this, SPAN_COUNT, GridLayoutManager.VERTICAL, true);

具体地说,最后一个参数是将reverseLayout属性设置为true。将其设置为false,RecyclerView不会滚动到屏幕底部。