RecyclerView制定位置滑动置顶,并实现头部悬停
2017-05-02 14:24
1296 查看
前些天产品经理提出了这个需求,花了1天时间终于实现,但最终没有运用到app中,但效果不错,在此记录,以备以后需要。
指定位置滚动置顶
重写OnScrollListener实现二次滚动和头部悬停
指定位置滚动置顶
private void smoothMoveToPosition(final int position) { //获取第一个跟最后一个可见item int firstItem = reGoods.getChildLayoutPosition(reGoods.getChildAt(0)); int lastItem = reGoods.getChildLayoutPosition(reGoods.getChildAt(reGoods.getChildCount() - 1)); if (position < firstItem) { // 如果要跳转的位置在第一个可见项之前,则smoothScrollToPosition可以直接跳转 reGoods.smoothScrollToPosition(position); } else if (position <= lastItem) { // 如果要跳转的位置在第一个可见项之后,且在最后一个可见项之前 // smoothScrollToPosition根本不会动,此时调用smoothScrollBy来滑动到指定位置 int movePosition = position - firstItem; if (movePosition >= 0 && movePosition < reGoods.getChildCount()) { int top = reGoods.getChildAt(movePosition).getTop(); reGoods.smoothScrollBy(0, top); } } else { // 如果要跳转的位置在最后可见项之后,则先调用smoothScrollToPosition将要跳转的位置滚动到可见位置 // 再通过onScrollStateChanged控制再次调用smoothMoveToPosition,进入上一个控制语句 reGoods.smoothScrollToPosition(position); mShouldScroll = true; mToPosition = position; } }
重写OnScrollListener实现二次滚动和头部悬停
private RecyclerView.OnScrollListener mOnScrollListener = new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { //找到第二个item 离顶部距离 小于头部高度 View view = linearLayoutManager.findViewByPosition(mCurrentPosition + 1); if (view != null) { //如果小于等于 view的高度 if (view.getTop() <= mSuspensionHeight) { //设置悬停view的位置 tvGroup.setY(-(mSuspensionHeight - view.getTop())); } else { //否则设置悬停就在顶部 tvGroup.setY(0); } } //当前位置不等于第一个可见位置 更新悬停view if (mCurrentPosition != linearLayoutManager.findFirstVisibleItemPosition()) { //当前位置为第一个可见位置 mCurrentPosition = linearLayoutManager.findFirstVisibleItemPosition(); //头部悬停 tvGroup.setY(0); if (!change) { typesAdapter.setSelect(mCurrentPosition); } tvGroup.setText(goodsGroups.get(mCurrentPosition).getGroupName()); } } @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); //测量头部悬停view的高度 mSuspensionHeight = tvGroup.getHeight(); if (newState == RecyclerView.SCROLL_STATE_IDLE) { //是否需要二次滚动 if (mShouldScroll) { mShouldScroll = false; //重新滚动 smoothMoveToPosition(mToPosition); } else { change = false; } } } };
相关文章推荐
- [置顶] RecyclerView和StaggeredGridLayoutManager实现瀑布流向下滑动item跳动、留白的问题
- RecyclerView实现侧滑删除、置顶、滑动
- RecyclerView实现聊天界面功不能滑动到指定位置问题
- 关于RecyclerView实现瀑布流,上下滑动时item之间互换位置的问题
- 【Android 手势冲突】彻底解决RecyclerView与ScrollView滑动冲突问题,并实现RecyclerView悬停导航栏(附demo)
- [置顶] tab头部滑动切换,TabLayout和ViewPager实现
- RecyclerView利用ItemDecoration实现头部悬停效果【类似微信通讯录效果】
- RecyclerView实现带有头部的顶部悬浮置顶布局
- 关于RecyclerView实现瀑布流,上下滑动时item之间互换位置的问题
- 利用RecyclerView实现的一个动画给变item的位置和左右滑动删除该RcyclervView的Item条目
- [置顶] Android LRecyclerView实现Item侧滑菜单、长按拖拽Item、滑动删除Item等功能
- 利用自定义的 RecyclerView 实现相册的滑动功能
- Android RecyclerView多个Item布局的实现(可实现头部底部)
- 使用ItemTouchHelper轻松实现RecyclerView拖拽排序和滑动删除
- 自定义ViewPager、HorizontalScrollView、Indicator实现可滑动的头部
- [置顶] 微信文章webview记录上次访问位置的实现原理和代码,webview记录并定位到上次访问位置
- RecyclerView实现条目Item拖拽排序与滑动删除
- RecyclerView 滑动删除与拖动的实现
- RecyclerView里嵌套ViewPager,滚动RecyclerView时,记住之前ViewPager滑动后的位置
- RecyclerView完美实现拖拽,滑动删除,撤销删除