首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RecyclerView OnScrollListener()问题

RecyclerView OnScrollListener()问题
EN

Stack Overflow用户
提问于 2016-03-12 14:10:07
回答 3查看 17.1K关注 0票数 12

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

问题

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

代码语言:javascript
复制
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);
                    }
                }
            }
        });
    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-12 14:27:14

这个实现看起来是正确的,但是有一种情况它失败了,尝试当dy >0时像这样(也把这个放在活动的OnCreate中):

代码语言:javascript
复制
    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);
                    }

                }
            }
        }
    });
票数 10
EN

Stack Overflow用户

发布于 2016-03-12 14:53:52

你正在使用这个

代码语言:javascript
复制
 if ((visibleItemCount + pastVisiblesItems) >= totalItemCount) 

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

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

票数 1
EN

Stack Overflow用户

发布于 2018-02-08 19:29:34

这里有另一种方法,当到达最后一项时触发某些东西

代码语言:javascript
复制
@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();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35954410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档