自定义RecyclerView 结合computeVerticalScrollExtent 设置scrollbar 高度
时间: 2023-11-16 19:22:55 浏览: 142
要实现自定义 RecyclerView 并结合 `computeVerticalScrollExtent()` 设置 scrollbar 高度,你可以继承 RecyclerView 实现自己的 RecyclerView,然后在它的 `onDraw()` 方法中计算可见 item 数量和滚动条高度,再在 `onMeasure()` 方法中设置 scrollbar 的高度。
首先,你需要在自定义 RecyclerView 中重写 `onDraw()` 方法:
```java
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 计算可见 item 数量
int visibleItemCount = getLayoutManager().getChildCount();
// 计算所有 item 的数量
int totalItemCount = getLayoutManager().getItemCount();
// 计算垂直方向上当前可见的视图区域的大小
int verticalScrollExtent = computeVerticalScrollExtent();
// 计算滚动条的高度
int scrollBarHeight = (int) ((float) verticalScrollExtent / (float) totalItemCount * getHeight());
// 绘制滚动条
Paint paint = new Paint();
paint.setColor(Color.RED);
canvas.drawRect(getWidth() - 20, 0, getWidth(), scrollBarHeight, paint);
}
```
在这段代码中,我们使用 `computeVerticalScrollExtent()` 方法计算垂直方向上当前可见的视图区域的大小,然后根据可见 item 数量、所有 item 的数量和视图区域的大小计算出滚动条的高度,最后在 Canvas 上绘制滚动条。
接下来,你还需要在自定义 RecyclerView 中重写 `onMeasure()` 方法:
```java
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
// 计算滚动条的高度
int verticalScrollExtent = computeVerticalScrollExtent();
int totalItemCount = getLayoutManager().getItemCount();
int scrollBarHeight = (int) ((float) verticalScrollExtent / (float) totalItemCount * getHeight());
// 设置滚动条的高度
setMeasuredDimension(getMeasuredWidth(), getMeasuredHeight() + scrollBarHeight);
}
```
在这段代码中,我们使用 `computeVerticalScrollExtent()` 方法计算垂直方向上当前可见的视图区域的大小,然后根据视图区域的大小计算出滚动条的高度,并将 RecyclerView 的高度加上滚动条的高度,从而保证滚动条不会遮挡 RecyclerView。
最后,你需要在自定义 RecyclerView 中调用 `setWillNotDraw(false)` 方法,以启用绘制滚动条的功能:
```java
public MyRecyclerView(Context context) {
super(context);
setWillNotDraw(false);
}
```
这样,你就可以实现自定义 RecyclerView 并结合 `computeVerticalScrollExtent()` 设置 scrollbar 高度的效果了。
阅读全文