2015-10-15 64 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());