Android如何在listview中更新单行?

时间:2014-01-23 13:57:54

标签: android listview

我有一个列表视图,每个项目都有pin按钮,即启动服务(下载项目)。 服务通过广播发送百分比,我必须更新pin按钮。 我正在尝试从列表视图中获取视图并将值设置为按钮,例如

int firstVisibleElement = postListView.getFirstVisiblePosition();
int lastVisibleElement = postListView.getLastVisiblePosition();
if (position >= firstVisibleElement && position <= lastVisibleElement) {
     View view = postListView.getChildAt(lastVisibleElement - position);
    }

但是当我在同步期间滚动时,它会返回错误的视图。 我该如何解决?

1 个答案:

答案 0 :(得分:0)

ListView中数据集位置和“子视图位置”的“转换”是错误的。

ListView中的子视图编号从0到listView.getChildCount() - 1。数据集中的位置(变量position应该是0)从{0}变为adapter.getCount() - 1。方法listview.getFirstVisiblePosition()返回屏幕上可见的第一个数据集位置,即数据集位置对应于ListView中的第0个视图。

现在说你的Adapter中有15个项目,屏幕上的ListView中有10个项目,你向下滚动了2个项目。这意味着数据集中的可见项位置为2到11,但“子视图位置”始终为0到9. listview.getFirstVisiblePosition()将返回2.

通过这个例子,很容易从“数据集位置”转换为“子视图位置”:子视图位置基本上是数据集位置减去第一个可见数据集位置:

int firstVisibleElement = postListView.getFirstVisiblePosition();
int lastVisibleElement = postListView.getLastVisiblePosition();
if (position >= firstVisibleElement && position <= lastVisibleElement) {
    View view = postListView.getChildAt(position - firstVisibleElement);
}