思路
1.假如已知列表高度,可以直接在布局中把RecyclerView的高度定义上
2.不知道列表高度情况下,需要手动计算RecyclerView的高度。(绝大多数情况)
代码实现
主要代码是在适配器中完成, 因为ItemView 只有在适配器中出现。
获取布局参数 要将其转换成上一层布局的类型
RecyclerView获取的布局参数转成上一层的LinearLayout.
itemView 获取到的参数布局 要转换成 RecyclerView 的参数
LinearLayout.LayoutParams RvLp = (LinearLayout.LayoutParams) mRv.getLayoutParams();
RecyclerView.LayoutParams itemViewLp = (RecyclerView.LayoutParams) mView.getLayoutParams();
主要代码
添加几个字段
private View mView;//null
private RecyclerView mRv;//null
private boolean isCalculationRvHeight;
方法实现
/**
* 1.获取ItemView的高度
* 获取ItemView的数模
* 3.使用 高度 * 个数 得到 RecyclerView的高度,并设置
*
* 该方法必须在绑定完成后才能进行调用--onBindViewHolder
* 只需调用一次
*/
private void getRecyclerViewHeight(){
if (isCalculationRvHeight || mRv == null) return;
isCalculationRvHeight = true;
// 获取View的参数 其高度表示为itemViewLp.height
RecyclerView.LayoutParams itemViewLp = (RecyclerView.LayoutParams) mView.getLayoutParams();
// 获得个数
int itemNum = getItemCount();
// 计算高度
int RvHeight = itemViewLp.height *itemNum;
// 设置高度
LinearLayout.LayoutParams RvLp = (LinearLayout.LayoutParams) mRv.getLayoutParams();
RvLp.height = RvHeight;
mRv.setLayoutParams(RvLp);
}
并且在onBindViewHolder中调用该函数
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
getRecyclerViewHeight();
}