Android getAdapterPosition始终返回getItemCount

问题描述 投票:1回答:1

我正在尝试开发一个recyclerview,它需要在用户向下滚动时(新闻提要的回收者)加载新元素。问题是,无论我尝试哪种方法,我的适配器都会看到回收站中的可见项目与getItemCount相同。我尝试的一种方法是在适配器中重写以下类:

@Override
public void onViewAttachedToWindow(@NonNull ViewHolder holder) {
    super.onViewAttachedToWindow(holder);
    if((getItemCount() -1) == holder.getAdapterPosition()){
        Log.e("TAGNews", "List Done!");
    }
}

或另一个在我的片段中实现的方法:

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);

                int visibleItemCount = manager.getChildCount();
                int totalItemCount = manager.getItemCount();
                int firstVisibleItem = manager.findFirstVisibleItemPosition();



                if (loading) {
                    if (totalItemCount > previousTotal) {
                        loading = false;
                        previousTotal = totalItemCount;
                    }
                }
                if (!loading && (totalItemCount - visibleItemCount)
                        <= (firstVisibleItem + visibleThreshold)) {
                    // End has been reached

                    Log.e("News!", "end called");

                    loadMoreNews();

                    loading = true;
                }
            }
        });

但是总是,当回收站打开时,必须在回收站结束时触发的我的调试消息。Here's how my recycler looks for the first time it's opened, without any scrolling

我从后端加载了3到10个项目,新闻的高度相似。

感谢您的指教!

java android android-recyclerview recycler-adapter
1个回答
0
投票

请将您的第二个代码更改为此:

int lastCompletelyVisibleItemPosition;
recycler.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(@NonNull RecyclerView recyclerView, int dx,    int dy) {
            super.onScrolled(recyclerView, dx, dy);
            lastCompletelyVisibleItemPosition = ((LinearLayoutManager) binding.recycler.getLayoutManager()).findLastVisibleItemPosition();
            if (dy > 5)
                if (lastCompletelyVisibleItemPosition == models.size() - 1) {
                  loadMoreData();
                }

        }
    });
© www.soinside.com 2019 - 2024. All rights reserved.