0

I try commbine StaggeredGrid RecyclerView with Endless and SwipeRefreshLayout. but I have issue with my code :

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

the code above, i get issue :

  1. At endlessly position, getMoreNewsFromServer(); always called (normal: one called).

  2. At endlessly position, mSwipeRefreshLayout is called

if i used Listview, it's work like this :

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

so how to fix it ?

Amay Diam
  • 2,561
  • 7
  • 33
  • 57

1 Answers1

-1

first thing:

"reach out where eyes can not reach"

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

so replace list - > with view in code fragment:

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

second:

it is risky to use mSwipeRefreshLayout without take care to check if it is not null! u can try to inser at beginning onScroll() {

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

third:

don't you experience of a refresh bug ? but maybe users of your app do ?

Community
  • 1
  • 1
ceph3us
  • 7,326
  • 3
  • 36
  • 43