我正在尝试将新RecyclerView类用于我希望组件在滚动时捕捉到特定元素的场景(将旧版Android Gallery作为具有中心锁定项的此类列表的示例).
这是我到目前为止采取的方法:
我有一个接口,ISnappyLayoutManager它包含一个方法,getPositionForVelocity它计算视图应该在给定初始fling速度的情况下结束滚动的位置.
public interface ISnappyLayoutManager {
int getPositionForVelocity(int velocityX, int velocityY);
}
Run Code Online (Sandbox Code Playgroud)
然后我有一个类,它以这样的方式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;
}
}
Run Code Online (Sandbox Code Playgroud)
由于几个原因,我对这种方法不是很满意.首先,似乎与"RecyclerView"的哲学相反,它必须将其子类化以实现某种类型的滚动.其次,如果我只想使用默认值LinearLayoutManager,这会变得有点复杂,因为我必须弄乱它的内部,以便了解它的当前滚动状态并精确计算滚动到的位置.最后,这甚至没有处理所有可能的滚动方案,就像你移动列表然后暂停然后举起手指一样,没有发生任何事件(速度太低),所以列表仍然处于中途位置.这可以通过添加一个on scroll状态监听器来处理RecyclerView,但也感觉非常hacky.
我觉得我必须遗漏一些东西.有一个更好的方法吗?
我正在使用Recyclerview和CardView.我知道如何控制列表视图的速度.但不适用于Recyclerview.
我在找到的类名SmoothScroll中搜索了很多.怎么用?我不知道!现在,Recyclerview默认滚动速度很快.
更新:
我总结吉尔回答与此
android android-support-library android-5.0-lollipop android-recyclerview