两个ListView之间的同步滚动滞后

时间:2014-09-12 10:35:01

标签: android android-layout listview android-view

我一直在努力实现两个ListView之间的同步,但我似乎无法使其顺利运行。

我们的想法是列表视图在LinearLayout内彼此相邻排列。每个列表视图的行可能非常复杂(即它们可能包含多个TextView, CheckBoxes,Spinners或Buttons)。用于每个ListView的数据集明显不同,因此左列表视图中的行与行相比可以具有不同的高度 在右侧列表视图中。我想要做的是让它们在同一位置具有相同的行高。

我设法使用相同的适配器为两个列表和引入中介模式。它现在做的是在getView返回视图之前我调用我的mediatator whcih中的方法 几乎做了以下几点:

需要绘制LV1中的第3行。 android绘制它并确定它需要40像素高。 在它返回之前,我调用我的调解器,它调查第二个列表视图中同一行的高度(我在调解器中保留两个适配器实例的引用)并返回它的70像素。 我将LV1中第3行的高度设置为70并重新绘制。

问题在于,无论什么时候需要绘制一个新行,它都会做很多工作,并且对getView()进行了大量的调用; 此外,当我在其中一个列表视图中更改行的高度以使其与另一个匹配时,我强制完全重绘该列表视图中的所有可见子项,这会增加更多延迟。

我的问题是 - 我的概念完全错了吗?我错过了什么吗?有没有更简单的方法来做我想做的事情?

        |        LV 1         |   |         LV 2        | 
        |         1           |   |          1          |    
        |         2           |   |          2          |  
        |         3           |   |          3          | 
        |         4           |   |          4          | 
        |         5           |   |          5          | 

1 个答案:

答案 0 :(得分:0)

您可以保留行高度数组,并在第一个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];
}

注意:我没有搜索确切的方法,因此您可以将上面的代码作为伪代码。