【问题标题】:Synchronization between two ListViews scroll lagging两个 ListView 之间的同步滚动滞后
【发布时间】:2014-09-12 10:35:01
【问题描述】:

我一直在尝试实现两个 ListView 之间的同步,但我似乎无法使其顺利工作。

这个想法是列表视图在 LinearLayout 中彼此相邻对齐。每个列表视图的行可能非常复杂(即它们可能包含多个 TextView, 复选框、微调器或按钮)。每个 ListView 使用的数据集明显不同,因此左侧列表视图中的行与行相比可以具有不同的高度 在正确的列表视图中。我想要做的是让它们在同一位置具有相同的行高。

我设法对两个列表使用相同的适配器并引入了中介模式。它现在所做的是在 getView 返回视图之前我在我的调解器中调用一个方法 几乎做了以下事情:

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

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

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

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

【问题讨论】:

    标签: android android-layout listview android-view


    【解决方案1】:

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

    注意:我没有搜索确切的方法,所以你可以把上面的代码当作伪代码。

    【讨论】:

    • 问题是,当我在运行时更改视图的高度时,所有可见视图都会重新绘制,并且需要很长时间。
    • 或者您应该预先计算所有值并设置标准高度
    • 那么你应该在通知适配器之前计算这个,然后当你得到所有值时开始绘制
    猜你喜欢
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多