android - 加载数据时 RecyclerView 滚动到底部

标签 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 -> {}));

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

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

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

编辑:我使用的版本是 25.3.1对于 RecyclerView

编辑 2:这就是我用 Account 更新我的适配器类的方式和 Post数据:

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

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

最佳答案

你试过吗?将父 RecyclerViewdescendantFocusability 属性设置为 blocksDescendants

这样做的目的是,它将不再关注回收器 View 中动态加载的 subview ,因此不会发生自动滚动。

android:descendantFocusability="blocksDescendants"

注意 descendantFocusability 属性可以与其他 View 以及 FrameLayout、RelativeLayout 等一起使用。因此,如果您将此属性设置为父/根布局,它不会再滚动到底部。

关于android - 加载数据时 RecyclerView 滚动到底部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47758084/

相关文章:

android - RecyclerView 中的 CardView 没有间隙和 textview 超出布局

java - 图像按钮可见性问题!安卓

java - AsyncTask 测试连接

android - 如何在 Android 中解决 Bangla 字体中的 jukto(连接)单词?

android - 格式化货币输入editText的更好方法?

java - 搜索栏小部件未启动可搜索 Activity

android - 使用 FlexboxLayoutManager 来查看不同高度的 RecyclerView 项目

android - 带有动态 Edittext 的 RecyclerView

android - RecyclerView + MediaPlayer + 切换按钮 + 字符串 Uri

android - 使用 LinearLayoutManager 在 RecyclerView 中滚动到顶部