我有一个列表视图,每个项目都有pin按钮,即启动服务(下载项目)。 服务通过广播发送百分比,我必须更新pin按钮。 我正在尝试从列表视图中获取视图并将值设置为按钮,例如
int firstVisibleElement = postListView.getFirstVisiblePosition();
int lastVisibleElement = postListView.getLastVisiblePosition();
if (position >= firstVisibleElement && position <= lastVisibleElement) {
View view = postListView.getChildAt(lastVisibleElement - position);
}
但是当我在同步期间滚动时,它会返回错误的视图。 我该如何解决?
答案 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);
}