【问题标题】:how to control SwipeRefreshLayout and Endless Fuction on Scroll StaggeredGrid RecyclerView?如何在滚动交错网格 RecyclerView 上控制 SwipeRefreshLayout 和 Endless 功能?
【发布时间】:2015-07-27 03:38:36
【问题描述】:

我尝试将 StaggeredGrid RecyclerView 与 Endless 和 SwipeRefreshLayout 结合使用。但我的代码有问题:

grid.addOnScrollListener(new RecyclerView.OnScrollListener() {
           @Override
           public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
               super.onScrolled(recyclerView, dx, dy);
               int visibleItemCount = grid.getChildCount();
               int totalItemCount = mLayoutManager.getItemCount();
               int firstVisibleItem = mLayoutManager.findFirstVisibleItemPositions(null)[0];
               if (firstVisibleItem == 0 && visibleItemCount > 0
                       && grid.getChildAt(0).getTop() >= 0) {
                   mSwipeRefreshLayout.setEnabled(true);
               } else {
                   mSwipeRefreshLayout.setEnabled(false);
               }
               mPreviousVisibleItem = firstVisibleItem;
               if (firstVisibleItem + visibleItemCount == totalItemCount
                       && totalItemCount != 0
                       && isFinishLoadingAwal
                       && !isFinishMoreNews
                       && adapter.getItemCount() > 0) {
                   getMoreNewsFromServer();
               }
           }
       });

上面的代码,我得到了问题:

  1. 在无限位置,getMoreNewsFromServer(); 总是被调用(正常:一个被调用)。

  2. 在无限位置,调用mSwipeRefreshLayout

如果我使用 Listview,它的工作方式是这样的:

list.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
            }
            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                if (firstVisibleItem == 0 && visibleItemCount > 0
                        && list.getChildAt(0).getTop() >= 0) {
                    mSwipeRefreshLayout.setEnabled(true);
                } else {
                    mSwipeRefreshLayout.setEnabled(false);
                }
                mPreviousVisibleItem = firstVisibleItem;
                if (firstVisibleItem + visibleItemCount == totalItemCount
                        && totalItemCount != 0
                        && isFinishLoadingAwal
                        && !isFinishMoreNews
                        && adapter.getCount() > 0) {
                    getMoreNewsFromServer();
                }
            }
        });

那么如何解决呢?

【问题讨论】:

    标签: android android-recyclerview swiperefreshlayout endlessscroll staggeredgridlayout


    【解决方案1】:

    第一件事:

    “伸到眼睛够不到的地方”

    onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
    

    所以在代码片段中将 list - > 替换为 view

       && list.getChildAt(0).getTop() >= 0 
    

    秒:

    使用 mSwipeRefreshLayout 而不注意检查它是否不为空是有风险的! 你可以尝试在开头插入 onScroll() {

    if (mSwipeRefreshLayout == null) {
       mSwipeRefreshLayout = (SwipeRefreshLayout) view.getRootView().findViewById(R.id...);
    } else { .. }
    

    第三个:

    您没有体验过refresh bug 吗?但也许您的应用的用户会这样做?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-20
      • 1970-01-01
      • 1970-01-01
      • 2014-09-30
      • 2016-06-17
      • 2015-10-31
      • 2016-10-24
      相关资源
      最近更新 更多