在使用 ListView/RecyclerView 通过 addFooterView 添加底部 View,当 item 比较多时,底部 View 不需要处理可以随着列表滑动,
但是当你 item 比较少时,就会出现底部 View 不在底部的情况,下图左边
有如下解决方案:先得到 ListView 的高度 listViewHeight,然后得到 footerView 的顶部到父布局也就是 ListView 顶部的距离 footerViewTop,这样两个值一相减就得到 footerView 的顶部到父布局 ListView 的底部的距离 distance,然后把这个值 distance 和 footerView 的高度 footerViewHeight 相比较,如果大于就说明无法填满屏幕,我们就可以把这个 distance 设置为 footerView 的高度,这样就可以填充屏幕了,上面右边图。上代码:
// footerView
mFooterView = LayoutInflater.from(this).inflate(R.layout.item_footer_view,
(ViewGroup) mRecyclerView.getParent(), false);
mFooterAdapter.addFooterView(mFooterView);
mRecyclerView.setAdapter(mFooterAdapter);
// 在 onCreate 中获取到的宽高是0,可以通过 view.post() 的方式在 post 方法里面获取到宽高。
mRecyclerView.post(new Runnable() {
@Override
public void run() {
int recyclerViewHeight = mRecyclerView.getHeight();
// int footerViewTop = mFooterView.getTop();
// 由于 BaseQuickAdapter 的 addFooterView 方法是将 footerView 添加到一个 LinearLayout 里面,
// 然后再把这个 LinearLayout 添加到 RecyclerView 的底部。所以在这里算 footerView 顶部到 RecyclerView 的顶部距离时,
// 就要先得到这个 footerView 的 父布局 LinearLayout,然后再通过 getTop 方法就可以得到 top 值。
// ListView 的 BaseAdapter 自带 addFooterView,此方法里面没有嵌套 ViewGroup,可以通过 footerView.getTop() 直接得到 top 值。
int footerViewTop = mFooterAdapter.getFooterLayout().getTop();
int footerViewHeight = mFooterView.getHeight();
if (recyclerViewHeight - footerViewTop > footerViewHeight) {
mFooterView.getLayoutParams().height = recyclerViewHeight - footerViewTop;
}
}
});