smartTable icon indicating copy to clipboard operation
smartTable copied to clipboard

recyclerview嵌套table,tabledata来自接口(即动态可变)时,如何在每个recyclerview的item里计算table高度?

Open 240651388 opened this issue 6 years ago • 2 comments

之所以有这个需求,是因为测试发现,当列表里处于屏幕外(不可见)的table因用户向上滑动而可见时,表格有些无法一次性显示全部的数据项,而以table内部可滚动的形式只显示部分数据,非吾所愿。

240651388 avatar Jan 12 '19 03:01 240651388

以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高度,隐隐觉得这里边涉及的东西太深,等有时间在进行深究。

240651388 avatar Jan 12 '19 03:01 240651388

问题原因和解决办法 https://www.jianshu.com/p/461998730e58

zhangwanggit avatar Nov 27 '19 10:11 zhangwanggit