2016-07-07 67 views
3

我有一个回调,在通过LinearLayoutManager.smoothScrollToPosition()程序化滚动到RecyclerView的某个项目后触发。用户点击一个项目,右边的项目滚动到RecyclerView的顶部。我对LinearLayoutManager进行了分类,使其始终捕捉到该项目的顶部。
这适用于滚动事件被触发的情况,但是当RecyclerView已经处于正确的位置时,我没有得到onScrollStateChanged回调,因为没有滚动发生。无论如何,是否有办法获得该事件?就像事先决定RecyclerView是否需要滚动一样?检查RecyclerView是否需要滚动

+0

你可以检查,如果你想滚动到该项目(位置)已经在调用之前的屏幕* LinearLayoutManager.smoothScrollToPosition()* – Bugdr0id

+0

这是不够的,因为它可能在屏幕上,但不在视图的顶部,在这种情况下无论如何滚动都会发生。 – Alf

+0

如何layoutManager.findFirstCompletelyVisibleItemPosition() – SoroushA

回答

-1

我发现下面的解决办法自己:

// get the view the user selected 
View view = mLayoutManager.findViewByPosition(index); 
// get top offset 
int offset = view.getTop(); 
if (offset == 0) { // the view is at the top of the scrollview 
    showDetailViewInternal(event); 
} else { 
    // scrolling 
} 
+0

如果它是列表中的最后一项,它将不起作用,因为它永远不会滚动到顶部。 –

1

希望下面的代码将有助于

if(LinearLayoutManager.findFirstCompletelyVisibleItem() == yourDesiredPosition) { 
    //do your stuff 
} else { 
    LinearLayoutManager.scrollToPositionWithOffset(yourDesiredPosition, offset); 
    //onScrollStateChanged would be trigger then. 
} 
+0

不,这只是告诉我,我正在寻找的项目是完全可见的屏幕上。它没有告诉我关于滚动位置的任何信息。该项目可能是可见的,但在屏幕的底部,然后RecyclerView将滚动。 – Alf

+0

我对你的要求有一个想法。如果在这种情况下,所有适配器项目都不覆盖整个屏幕,则不会触发滚动事件。尝试将透明视图添加到适配器布局,并在不包含整个屏幕的情况下使其显示在最后一个项目中。为透明视图指定一个固定的高度,以便它离开屏幕。 – user320676

+0

为什么这意味着滚动事件不会被解雇?无论如何,我发现比将透明视图添加到我的布局更好的解决方案。看到我上面的答案。 – Alf

相关问题