smartTable
smartTable copied to clipboard
recyclerview嵌套table,tabledata来自接口(即动态可变)时,如何在每个recyclerview的item里计算table高度?
之所以有这个需求,是因为测试发现,当列表里处于屏幕外(不可见)的table因用户向上滑动而可见时,表格有些无法一次性显示全部的数据项,而以table内部可滚动的形式只显示部分数据,非吾所愿。
以form为module library导入,摸索之后,找到一个不尽人意的处理方法,增加部分代码如下: SmartTable类增加如下: 1、给SmartTable添加一个计算完table高度的监听回调类 //****************************************************************** //以下代码为项目逻辑需要新增代码 //因table嵌套在recyclerview内,导致在屏幕外的表格有些无法完全显示, //故增加一个监听回调类,在计算完table的高度后,回调UI线程,强行设置table的layoutmanager来设置高度 public interface MyLogicListener { void onCalculateHeightEnd(int height); }
private MyLogicListener myLogicListener;
public void setMyLogicListener(MyLogicListener myLogicListener) {
this.myLogicListener = myLogicListener;
}
//******************************************************************
2、在SmartTable的notifyDataChanged()方法内,代码measurer.measure(tableData, config);执行完计算高度后,增加如下代码: /********************************************* 如果在其它线程访问UI线程,Android提供了以下的方式: (1)Activity.runOnUiThread(Runnable) (2)View.post(Runnable) (3)View.postDelayed(Runnable, long) (4)Handler **********************************************/ final int tableHeight = info.getTableRect().height(); post(new Runnable() { @Override public void run() { if (myLogicListener != null) { myLogicListener.onCalculateHeightEnd(tableHeight); } } });
注:1、MyLogicListener也可以不添加,直接在Runnable的run()里边调用setLayoutParams()来设置table的高度亦可,之所以增加MyLogicListener是因为考虑到table的父容器不一定是LinearLayout。 2、之所以说不尽人意,是因为notifyDataChanged()方法本身已经重新测量table高度并postInvalidate()刷新布局,不知为何无法动态计算出table高度,隐隐觉得这里边涉及的东西太深,等有时间在进行深究。
问题原因和解决办法 https://www.jianshu.com/p/461998730e58