【问题标题】:Android getAdapterPosition returns always getItemCountAndroid getAdapterPosition 总是返回 getItemCount
【发布时间】:2020-04-29 20:50:30
【问题描述】:

我正在尝试开发一个 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


    【解决方案1】:

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

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

    【讨论】:

    • 是的,你是对的,但问题是其他的。新闻提要需要分页,所以当我进行后端调用时,我会收到所需页面的 n 条新闻,并将其传递给回收站。正如您所说,getItemCount 工作正常,但为什么我的适配器总是说第一个元素是屏幕上呈现的最后一个元素。基本上我想在用户到达最后一条新闻时调用请求新页面的方法。
    • 我根据您的评论编辑了我的答案,请再次检查,如果对您有帮助,请确认。谢谢
    猜你喜欢
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    • 2018-01-16
    • 2012-12-25
    相关资源
    最近更新 更多