captain-miao / RecyclerViewUtils

[DEPRECATED] // RecyclerView Utils:refresh,load more,sticky header,expand,index
276 stars 68 forks source link

上拉到底部,加载更多的时候,快速往上划一下,有时会触发两次onLoadNextPage,导致数据重复 #10

Closed liyiheng closed 8 years ago

liyiheng commented 8 years ago

可能是我没用对,也可能确有bug

目前暂时解决办法是在EndlessRecyclerOnScrollListener中的onScrollStateChanged()方法中进行判断; 如果距上次触发onScrollStateChanged()时间不到1秒就直接return. 不知道有没有更好的解决办法 我用的不是最新版,由于我目前是直接改了EndlessRecyclerOnScrollListener, 并没有直接换最新. 不知道最新版还有没有这个问题

// 找到了解决办法 //另外, //有时候划动到底部已经没有更多数据,但footer仍然是loading状态, 需要稍微下拉再上划才变成end状态

captain-miao commented 8 years ago

谢谢反馈哈

重复加载问题

EndlessRecyclerOnScrollListener这个类改掉了,你看下有没有加载中的判断。

不知道什么时候的版本,现在如果加载中,直接忽略。 增加了方法:mRefreshRecyclerView.loadMoreComplete();

// LinearLayoutWithRecyclerOnScrollListener.java
    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        if (!isLoading()) {
            visibleItemCount = recyclerView.getChildCount();
            totalItemCount = mLinearLayoutManager.getItemCount();
            firstVisibleItem = mLinearLayoutManager.findFirstVisibleItemPosition();

            //totalItemCount > visibleItemCount load more
            if (loadMoreEnable && !loading && totalItemCount > visibleItemCount && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) {
                // End has been reached
                loading = true;
                pagination++;
                onLoadMore(pagination, pageSize);
            }
        }
    }

footer仍然是loading状态

每次数据加载完成后(不管成功、失败),需要mRefreshRecyclerView.hideFooterView();

        public void onSuccess(S result) {
            if (result == null || (result instanceof List && ((List)result).size() == 0)) {
                if (isDataEmpty()) {
                    showDataEmptyView();
                } else {
                    showNoMoreDataView();
                    mRefreshRecyclerView.disableLoadMore();
                }
            } else {
                if (isRefresh) {
                    onRefreshDataSuccess(result);
                } else {
                    onLoadMoreDataSuccess(result);
                }
                hideLoadMoreView();
                currPage++;
            }
        }

        @Override
        public void onAfter() {
            if(isRefresh){
                hideRefreshView();
            }
            mRefreshRecyclerView.loadMoreComplete();
            if(!isDataEmpty()){
                hideDataEmptyView();
            }
        }

这些状态的切换是很麻烦,等几天把我的二次封装放上来。

captain-miao commented 8 years ago

可以参考:

BaseRecyclerActivity RefreshRecyclerActivity

liyiheng commented 8 years ago

thks