在 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();
            }

        }
    });