自定义一个简易的RecyclerView的LinearLayuoutManager
16lz
2021-12-04
package com.example.myapplication1.view;import android.support.v7.widget.RecyclerView;import android.view.View;import android.view.ViewGroup;public class MyLinearLayoutManager extends RecyclerView.LayoutManager { @Override public RecyclerView.LayoutParams generateDefaultLayoutParams() { return new RecyclerView.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); } @Override public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) { int offsetY = 0; for (int i = 0; i < getItemCount(); i++) { View viewForPosition = recycler.getViewForPosition(i); addView(viewForPosition); measureChildWithMargins(viewForPosition,0,0); int measuredHeight = viewForPosition.getMeasuredHeight(); int measuredWidth = viewForPosition.getMeasuredWidth(); layoutDecorated(viewForPosition,0,offsetY,measuredWidth,offsetY+measuredHeight); offsetY += measuredHeight; } } @Override public boolean canScrollVertically() { return true; } /** * * @param dy 往下滑动 dy < 0 ,往上滑动, dy > 0 * @param recycler * @param state * @return */ @Override public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler, RecyclerView.State state) { View firstView = getChildAt(0); int top = firstView.getTop(); View lastView = getChildAt(getChildCount() - 1); int bottom = lastView.getBottom(); //RecyclerView的实际可容纳空间的高度 int height = getHeight() - getPaddingBottom() - getPaddingTop(); //将偏移量转换成符合逻辑的,即:向下为正,向上为负 int newDy = -dy; //顶部: //第一个view的顶部与RecyclerView的顶部刚好重合,不能再往下滑动了,newDy >0 代表向下滑动 if (top == 0 && newDy > 0){ return 0; } //top <0 说明recyclerView中的内容已经向上滑动一段距离 //如果(top + newDy,即新的top)>0 就让它等于0,让它等于0的条件,就是 newDy = -top if (top < 0 && top + newDy > 0){ newDy = -top; } //底部:== 0,最后一个View的底边 与RecyclerView的底边已重合,不能再往上滑动了 //底部, < 0 的情况是内容过少 未充满RecyclerView,就是 最后一个itemView 的bottom 天生比 RecyclerView的 height 小 if(bottom <= height && newDy <0){ return 0; } //已经超出了RecyclerView的底边,但是要保证不能小于滑动到底边里面(即上部) //bottom + newDy < height 时,bottom + newDy = height,所以 newDy = height - bottom = -(bottom - height) if (bottom > height && bottom + newDy < height){ newDy = - (bottom - height); } offsetChildrenVertical(newDy); return dy; }}
更多相关文章
- Android(安卓)用手势切换activity
- Android使用Fragment嵌套Fragment的方式实现界面滑动
- Android(安卓)滑动加载数据
- android主页框架FragmentTabHost+ViewPager,左右滑动
- Android中禁止Gridview上下滑动
- android上下左右滑动监听
- Android(安卓)RecyclerView 滑动删除例子
- Android: 扩展WebView 和ViewPager实现viewpager中的水平滑动,类
- Android(安卓)左右滑动控件