【问题标题】:RecyclerView OnScrollListener() IssueRecyclerView OnScrollListener() 问题
【发布时间】:2016-06-27 12:51:39
【问题描述】:

我在 json 中有大约 32 条记录,我正在使用 RecyclerView 来显示它们,并且我已经实现了 OnScrollListener(...)

问题

我开始了一个活动,我获取了所有 32 条记录,现在当我滚动时,为什么我一次又一次地获得相同的 32 条记录,每当我滚动时,这是我的 OnScrollListener() 实现

public void initializeOnScrollForRecyclerView() {
        mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {

                int visibleItemCount = recyclerView.getLayoutManager().getChildCount();
                int totalItemCount = recyclerView.getLayoutManager().getItemCount();
                int pastVisiblesItems = ((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstVisibleItemPosition();

                if (!isLoading) {
                    if ((visibleItemCount + pastVisiblesItems) >= totalItemCount) {
                        isLoading = true;
                        mPostPresenter.loadPosts(false);
                    }
                }
            }
        });
    }

【问题讨论】:

  • mPostPresenter.loadPosts(false) 是做什么的?它会再次加载 json 吗?
  • @RageshRamesh 检查现在我发布了更多代码
  • 我添加了一个答案,看看它是否能解决您的问题。如果它不让我知道,我会进一步调查。

标签: android android-recyclerview android-appcompat onscrolllistener


【解决方案1】:

实现似乎是正确的,但是对于一种情况它失败了,当 dy > 0 时尝试这样(也将它放在 Activity 的 OnCreate 中):

    private boolean loading = true;

 recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
        }


        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy)
        {

            if (loading) {
                if (dy > 0) //check for scroll down
                {
                    visibleItemCount = layoutManager.getChildCount();
                    totalItemCount = layoutManager.getItemCount();
                    pastVisiblesItems = layoutManager.findFirstVisibleItemPosition();

                    if ((visibleItemCount + pastVisiblesItems) >= totalItemCount) {
                        loading = false;

                        Log.v("...", " Reached Last Item");
                        loadMoreVideos(searchVideos);
                    }

                }
            }
        }
    });

【讨论】:

  • 谢谢 :) 你的解决方案对我有用,但我不明白 dy 和 dx 代表什么?
  • dx - 水平滚动量。 dy - 垂直滚动的量。
  • @VeereshCharantimath - 嗨。对于水平回收视图,我需要同样的东西。想要在最后一个可见的项目上调用 Web 服务。但我无法做到这一点。请你指导我。
  • 检查我的另一个答案
【解决方案2】:

你正在使用这个

 if ((visibleItemCount + pastVisiblesItems) >= totalItemCount) 

这意味着一旦您查看了 22 条记录,您将再次加载。在再次加载时,您将获得相同的数据并将其附加到您的列表中。

我可以看到您正在使用 RXjava。当您订阅 loadPost 时,请检查您的 observable 正在发出什么数据。我认为它再次发出相同的数据,即您的 32 条记录并且这些记录被再次添加,这是一个无限循环。

【讨论】:

  • 如果你不使用分页,你可以删除 onscroll 监听器块。如果您使用分页,那么您的问题出在 mApi.getPosts() 块上。如果您的服务器使用了分页,那么您必须在请求中发送页码。
  • 暂时移除 onscroll 监听器。一旦实现了分页,您就可以回到这一点。
【解决方案3】:

这是到达最后一项时触发某事的另一种方法

@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {

    //When last item is reached
    if(position == yourList.size() - 1){
        loadMoreMessages();
    }
  }

public abstract void loadMoreMessages();

【讨论】:

  • TOP 解决方案,3 行代码代替以前的组合解决方案,感谢 Veeresh
猜你喜欢
  • 2020-01-16
  • 1970-01-01
  • 2015-08-30
  • 1970-01-01
  • 2016-11-05
  • 2012-11-25
  • 1970-01-01
  • 2019-09-21
  • 1970-01-01
相关资源
最近更新 更多