2015-10-05 29 views
0

recyclerview配備了具有低於方法自己的滾動監聽器:要調用如何實現分頁中RecyclerView上滾動

void onScrollStateChanged(RecyclerView recyclerView, int newState) 

回調方法RecyclerView的滾動狀態發生變化時。

void onScrolled(RecyclerView recyclerView, int dx, int dy) 

RecyclerView被滾動時調用的回調方法。

當滾動到達列表的末尾時,有什麼辦法可以觸發loader加載更多的數據嗎?

我已經實現了這種方式:

@Override 
public void onBindViewHolder(ViewHolder viewHolder, int i) { 
    GenerItem generItem=generItems.get(i); 
    Log.d("TAG","position "+i); 
    if(i==generItems.size()-1) 
    ((GenerSearchActivity)mContext).onScroll(i); 
    viewHolder.bindValues(generItem); 
} 

這裏onScroll()的活動將觸發加載器加載更多的數據。請建議最好的方法是什麼?

+0

不工作的方法是什麼? – Buddy

+0

它的工作,但我不知道天氣是一個好方法繼續或有任何替代方法來實現此功能。 – RQube

+0

這似乎是一個合理的方法! – Buddy

回答

0

這裏是它實現負載更快速的回報模式的滾動監聽器:

public abstract class HidingScrollListener extends RecyclerView.OnScrollListener { 

    private static final float HIDE_THRESHOLD = 10; 
    private static final float SHOW_THRESHOLD = 70; 

    private int     mToolbarOffset = 0; 
    private boolean    mControlsVisible = true; 
    private int     mToolbarHeight; 
    private int     mTotalScrolledDistance; 
    private int     previousTotal = 0; 
    private boolean    loading   = true; 
    private int     visibleThreshold = 4; 
    int       firstVisibleItem, visibleItemCount, totalItemCount; 
    private LinearLayoutManager layoutManager; 

    public HidingScrollListener(Context context, LinearLayoutManager layoutManager) { 
     mToolbarHeight = Tools.getFooterHeight(context); 
     this.layoutManager = layoutManager; 
    } 

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

     if (newState == RecyclerView.SCROLL_STATE_IDLE) { 
      if (mTotalScrolledDistance < mToolbarHeight) { 
       setVisible(); 
      } 
      else { 
       if (mControlsVisible) { 
        if (mToolbarOffset > HIDE_THRESHOLD) { 
         setInvisible(); 
        } 
        else { 
         setVisible(); 
        } 
       } 
       else { 
        if ((mToolbarHeight - mToolbarOffset) > SHOW_THRESHOLD) { 
         setVisible(); 
        } 
        else { 
         setInvisible(); 
        } 
       } 
      } 
     } 

    } 

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

     clipToolbarOffset(); 
     onMoved(mToolbarOffset); 

     if ((mToolbarOffset < mToolbarHeight && dy > 0) || (mToolbarOffset > 0 && dy < 0)) { 
      mToolbarOffset += dy; 
     } 
     if (mTotalScrolledDistance < 0) { 
      mTotalScrolledDistance = 0; 
     } 
     else { 
      mTotalScrolledDistance += dy; 
     } 
     // for load more 
     visibleItemCount = recyclerView.getChildCount(); 
     totalItemCount = layoutManager.getItemCount(); 
     firstVisibleItem = layoutManager.findFirstVisibleItemPosition(); 

     if (loading) { 
      if (totalItemCount > previousTotal) { 
       loading = false; 
       previousTotal = totalItemCount; 
      } 
     } 
     if (!loading && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) { 
      // End has been reached 
      // Do something 

      loading = true; 
      onLoadMore(); 
     } 
    } 

    private void clipToolbarOffset() { 
     if (mToolbarOffset > mToolbarHeight) { 
      mToolbarOffset = mToolbarHeight; 
     } 
     else if (mToolbarOffset < 0) { 
      mToolbarOffset = 0; 
     } 
    } 

    private void setVisible() { 
     if (mToolbarOffset > 0) { 
      onShow(); 
      mToolbarOffset = 0; 
     } 
     mControlsVisible = true; 
    } 

    private void setInvisible() { 
     if (mToolbarOffset < mToolbarHeight) { 
      onHide(); 
      mToolbarOffset = mToolbarHeight; 
     } 
     mControlsVisible = false; 
    } 

    public abstract void onMoved(int distance); 

    public abstract void onShow(); 

    public abstract void onHide(); 

    public abstract void onLoadMore(); 
} 

而且它的實現如下:

HidingScrollListener scrollListener = new HidingScrollListener(activity, manager) { 
     @Override 
     public void onMoved(int distance) { 

     } 

     @Override 
     public void onShow() { 

     } 

     @Override 
     public void onHide() { 

     } 

     @Override 
     public void onLoadMore() { 
      // you can do your pagination here. 
     } 
     }; 
     mRecyclerView.addOnScrollListener(scrollListener);