2015-10-15 41 views
0

我使用隱藏滾動偵聽器recyclerview。當我向下滾動recyclerview並釋放滾動時,如果加載更多內容並將新內容添加到插入了項目範圍的適配器,則以前添加了我的行或添加了新的未響應點擊。但是當我再次滾動一點點時,所有的點擊嘗試都起作用。RecyclerView + HidingScrollListener +加載更多

這裏是我的HidingScrollListener

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

onLoadMore()

mAdapter.notifyItemRangeInserted(size, data.size()); 

我想不通爲什麼會發生的事情。這很奇怪。謝謝。

回答

0

重點是我通知錯誤的範圍,當我嘗試使用notifyItemRangeChanged()我的RecyclerViewAdapter方法。

這導致阻止Ui線程,所以我無法得到任何動作onClick之前,我打斷了ui線程。

當我爲通知適配器設置一個有效的項目範圍時,它已被修復。

我希望我的答案能幫助別人。

正確的調用低於:

mAdapter.notifyItemRangeChanged(size+1, data.size());