我对 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>
其中 Account
和 Post
是 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);
}
最佳答案
你试过吗?将父 RecyclerView
的 descendantFocusability
属性设置为 blocksDescendants。
这样做的目的是,它将不再关注回收器 View 中动态加载的 subview ,因此不会发生自动滚动。
android:descendantFocusability="blocksDescendants"
注意 descendantFocusability
属性可以与其他 View 以及 FrameLayout、RelativeLayout 等一起使用。因此,如果您将此属性设置为父/根布局,它不会再滚动到底部。
关于android - 加载数据时 RecyclerView 滚动到底部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47758084/