Mac*_*ich 9 android android-recyclerview
我最近开始使用SnapHelper里面提供的内容Support Library v24,以便RecyclerView在Google Play商店中获得漂亮的水平效果.
我的问题很简单.
通过使用RecyclerView.OnScrollListener我可以在滚动状态稳定时得到通知(非常类似于ViewPager.OnPageChangedListener.这很重要,因为当滚动稳定时,我需要为将作为默认行为居中的视图设置动画LinearSnapHelper.该动画显示重点放在即将成为中心的项目上.
现在,我设法通过以下行获得滚动状态空闲时居中的视图:
final int centered = (llm.findLastCompletelyVisibleItemPosition() - llm.findFirstCompletelyVisibleItemPosition()) / 2 + llm.findFirstVisibleItemPosition(); // where llm is my LinearLayoutManager
Run Code Online (Sandbox Code Playgroud)
问题是,当滚动完成时启动动画很奇怪:我真的需要在滚动停止时平滑地播放动画,这样当滚动空闲时,动画也会完成.
所以你可以看到,我很难找到我的哪一项RecyclerView将是一个居中的.
这是我到目前为止尝试的解决方案.
当滚动状态设置为时,我尝试使用相同的计算RecyclerView.SCROLL_STATE_SETTLING.不幸的是,findVisiblePosition当滚动不是空闲时从适配器调用方法是一个坏主意:根据滚动速度,当调用这些所谓的方法时,可见项目在滚动完成时可能不完全相同.实际上它会告诉我在通话时哪些物品是可见的.这完全有道理,但我需要尝试找出...
我尝试扩展,LinearSnapHelper以便在onFling(...)调用时我可以使用findSnapView(...)获取将被捕捉的视图,或者使用findTargetSnapPosition(...)希望告诉我滚动完成时哪个视图居中;
当滚动状态是时RecyclerView.SCROLL_STATE_SETTLING,我也尝试过使用findSnapView(...)
在所有这些解决方案中,没有一个通过多次测试(尝试不同的滑动强度和速度).有些人在一些情况下做对了,但在不同情况下弄错了,因此解决方案无法使用.
看了看之后,LinearSnapHelper我想我开始明白了,不知何故,在滑动之后,这个类计算总滚动并在滚动完成之前多次必要时捕捉视图(滚动距离的数量)因此知道哪个视图将会是最后拍摄的视图 ......除非我把它弄错了因为拍摄不对中?
无论如何,我的主要问题是:无论速度和力度如何,我怎么知道RecyclerView滑动后我的哪个项目会居中?
编辑:
正如一些人所指出的那样,这是不可靠的,特别是当快速滑动而不是甩动导致卡扣发生时.
我建议使用a RecyclerView.OnScrollListener,并在" RecyclerView已确定"后检查位置.这里有一个很好的教程
上一个答案:
您需要子类化SnapHelper和覆盖findTargetSnapPosition.计算super.findTargetSnapPosition(layoutManager, velocityX, velocityY)的位置RecyclerView是您要捕捉的位置.
SnapHelper snapHelper = new LinearSnapHelper() {
@Override
public int findTargetSnapPosition(RecyclerView.LayoutManager layoutManager, int velocityX, int velocityY) {
int snapPosition = super.findTargetSnapPosition(layoutManager, velocityX, velocityY);
// Do something with snapPosition
return snapPosition;
}
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5685 次 |
| 最近记录: |