在 NestedScrollView 中创建 RecyclerView ViewHolder
RecyclerView ViewHolder creation inside NestedScrollView
我有两个问题是由同一个来源引起的。
我正在开发一个社交媒体应用程序,我有一个个人资料视图,其中包含个人资料图片的 CollapsingToolbarLayout
和 post 提要的 NestedScrollView
中的 RecyclerView
。
我没想到的行为是,假设我在 RecyclerView 中有 20 个 post,而屏幕只能显示 3 个,回收器适配器创建了 20 个视图持有者,它们都被认为是可见的.
这给我带来了两个问题:
1 - post 可能包含视频,如果 post 在屏幕上不可见,我希望视频停止播放。我曾经在我的其他 RecyclerViews 上这样做过。
@Override
public void onViewDetachedFromWindow(@NonNull RecyclerView.ViewHolder holder) {
if (holder instanceof PostViewHolder) {
PostViewHolder postViewHolder = (PostViewHolder) holder;
pauseVideo(postViewHolder.videoPlayer);
}
}
此方法从未被调用,因为 RecyclerView 或适配器或任何认为所有视图持有者在屏幕上可见的东西。为了确保我的假设是正确的,我在 onViewAttachedToWindow
上进行了登录,如果列表包含 20 个 post,当我将列表添加到 RecyclerView 时它会被调用 20 次。
2 - 我希望动态加载 posts(在滚动时加载小批量)。这是使用此方法实现的:
WrapContentLinearLayoutManager llManager = new WrapContentLinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(llManager);
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
if(dy > 0) { //check for scroll down
if (llManager.findFirstVisibleItemPosition() + 10 > llManager.getItemCount() && !loadingMorePosts) {
loadingMorePosts = true;
dbListeners.getMoreUserPosts();
}
}
}
});
这也行不通,因为 llManager.findFirstVisibleItemPosition()
总是 returns 0.
我是不是做错了什么,或者这是嵌套 ScrollView 中的 RecyclerView 的预期行为?
对于第二个问题是否有解决方案或解决方法,因为一次加载所有 post 是不可接受的。
谢谢。
您必须在 nessterscroll 视图的滚动侦听器中处理分页
nestedScrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
@Override
public void onScrollChange(NestedScrollView view, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
if (scrollY == (view.getChildAt(0).getMeasuredHeight() - view.getMeasuredHeight())&& !loadingMorePosts) {
loadingMorePosts = true;
dbListeners.getMoreUserPosts();
}
}
});
我有两个问题是由同一个来源引起的。
我正在开发一个社交媒体应用程序,我有一个个人资料视图,其中包含个人资料图片的 CollapsingToolbarLayout
和 post 提要的 NestedScrollView
中的 RecyclerView
。
我没想到的行为是,假设我在 RecyclerView 中有 20 个 post,而屏幕只能显示 3 个,回收器适配器创建了 20 个视图持有者,它们都被认为是可见的.
这给我带来了两个问题: 1 - post 可能包含视频,如果 post 在屏幕上不可见,我希望视频停止播放。我曾经在我的其他 RecyclerViews 上这样做过。
@Override
public void onViewDetachedFromWindow(@NonNull RecyclerView.ViewHolder holder) {
if (holder instanceof PostViewHolder) {
PostViewHolder postViewHolder = (PostViewHolder) holder;
pauseVideo(postViewHolder.videoPlayer);
}
}
此方法从未被调用,因为 RecyclerView 或适配器或任何认为所有视图持有者在屏幕上可见的东西。为了确保我的假设是正确的,我在 onViewAttachedToWindow
上进行了登录,如果列表包含 20 个 post,当我将列表添加到 RecyclerView 时它会被调用 20 次。
2 - 我希望动态加载 posts(在滚动时加载小批量)。这是使用此方法实现的:
WrapContentLinearLayoutManager llManager = new WrapContentLinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(llManager);
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
if(dy > 0) { //check for scroll down
if (llManager.findFirstVisibleItemPosition() + 10 > llManager.getItemCount() && !loadingMorePosts) {
loadingMorePosts = true;
dbListeners.getMoreUserPosts();
}
}
}
});
这也行不通,因为 llManager.findFirstVisibleItemPosition()
总是 returns 0.
我是不是做错了什么,或者这是嵌套 ScrollView 中的 RecyclerView 的预期行为? 对于第二个问题是否有解决方案或解决方法,因为一次加载所有 post 是不可接受的。
谢谢。
您必须在 nessterscroll 视图的滚动侦听器中处理分页
nestedScrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
@Override
public void onScrollChange(NestedScrollView view, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
if (scrollY == (view.getChildAt(0).getMeasuredHeight() - view.getMeasuredHeight())&& !loadingMorePosts) {
loadingMorePosts = true;
dbListeners.getMoreUserPosts();
}
}
});