我正在尝试使用新的 RecyclerView
类来实现这样一个场景: 我希望组件在滚动时与特定的元素对齐(我想到的旧的 Android Gallery
就是这样一个带有中心锁定项的列表的例子)。
这就是我迄今为止采取的方法:
我有一个接口,ISnappyLayoutManager
,其中包含一个方法,getPositionForVelocity
,它计算在哪个位置的视图应该结束滚动的初始抛出速度。
public interface ISnappyLayoutManager {
int getPositionForVelocity(int velocityX, int velocityY);
}
然后我有一个类 SnappyRecyclerView
,它的子类 RecyclerView
覆盖了它的 fling ()方法,以使视图具有正确的抛出量:
public final class SnappyRecyclerView extends RecyclerView {
/** other methods deleted **/
@Override
public boolean fling(int velocityX, int velocityY) {
LayoutManager lm = getLayoutManager();
if (lm instanceof ISnappyLayoutManager) {
super.smoothScrollToPosition(((ISnappyLayoutManager) getLayoutManager())
.getPositionForVelocity(velocityX, velocityY));
}
return true;
}
}
由于几个原因,我对这种方法不是很满意。首先,为了实现某种类型的滚动,必须对其进行子类化,这似乎与“回收视图”的哲学背道而驰。其次,如果我只想使用默认的 LinearLayoutManager
,这就变得有些复杂,因为我必须搞清楚它的内部结构,以便理解它当前的滚动状态,并精确地计算出它滚动到哪里。最后,这甚至没有考虑到所有可能的滚动场景,如果你移动列表,然后暂停,然后举起一个手指,没有抛出事件发生(速度太低) ,所以列表保持在一半的位置。这可以通过向 RecyclerView
添加一个在滚动状态的侦听器来解决,但是这也让人感觉非常古怪。
我觉得我肯定漏掉了什么,有更好的办法吗?