2015-10-05 83 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);