我一直在尝试实现两个ListView之间的同步,但似乎无法使其顺利工作。
其思想是,列表视图在LinearLayout中并排排列。每个列表视图的行可以是非常复杂的(即,它们可以包括多个TextView,复选框、微调器或按钮)。每个ListView使用的数据集明显不同,因此左列表视图中的行与行相比可能具有不同的高度在右侧列表视图中。我想做的是让它们在相同的位置具有相同的行高。
我成功地为两个列表使用了相同的适配器,并引入了中介模式。它现在所做的是在getView返回我在中介whcih中调用的方法的视图之前大致如下:
需要绘制LV1中的第3行。android绘制了它,并确定它需要40像素高。在返回之前,我调用我的中介器,它检查第二个列表视图中同一行的高度(我在中介器中保留两个适配器实例的引用)位置,并返回它是70像素。我将LV1中第3行的高度设置为70并重新绘制。
问题是,每当它需要绘制新行时,它都会做大量的工作,而且对getView()的调用数量惊人;此外,当我更改其中一个列表视图中一行的高度以使其与另一行匹配时,我会强制重新绘制该列表视图中所有可见的子项,这会增加更多的滞后。
我的问题是——我的概念完全错了吗?我是不是遗漏了什么?有没有一种更简单的方法可以做我想做的事?
| LV 1 | | LV 2 |
| 1 | | 1 |
| 2 | | 2 |
| 3 | | 3 |
| 4 | | 4 |
| 5 | | 5 |
您可以保留一个行高数组,并将两行的最大高度存储在第一个getView调用中。然后对于其他时间,只需获取该数组中每一行的高度。
int [] rowHeight = new int[rowCount];
boolean firstTime = true;
然后在您的getView方法中:
if(firstTime){
if(rowHeight[position] < currentView.getHeight()){
rowHeight[position] = currentView.getHeight();
}
}else{
currentView.setHeight() = rowHeight[position];
}
注意:我没有搜索确切的方法,所以你可以把上面的代码当作伪代码。