带有 ArrayAdapter 的 ListView 似乎是将数据绑定到 UI 元素并访问渲染/重新渲染策略的唯一方法。
我想在图像(地图)上方绝对定位(x,y)UI元素(标记)。如果数据保持静态,我只需在 FrameLayout 中的 RelativeLayout 中使用 ImageView 并设置 RelativeLayout 的边距来更改标记的 x 和 y 位置(“简单”是一种严重的轻描淡写)。
但是,数据会每隔一段时间发生变化(标记会移动或改变颜色),我希望利用 ArrayAdapter 的 notifyDataSetChanged() 方法重新渲染标记并重新定位它们。
两个问题(可能彼此无关):
- 带有 ListView 的 ArrayAdapter 是绑定(当数据更改时,UI 元素重新呈现)数据到 Android 中的 UI 元素的唯一方法吗?
- 我可以绝对定位(想想 HTML/CSS)作为 ListView 中的项目的 UI 元素吗?
编辑 我现在实施了一些“有效”的东西......
// Excerpt from MyCustomAdapter.getView()
AbsListView.LayoutParams layoutParams = new AbsListView.LayoutParams(50, 50);
convertView.setLayoutParams(layoutParams);
convertView.setY((float) y);
convertView.setX((float) x);
return convertView;
...我不喜欢这种解决方案,因为 convertView 视图(地图上的标记)在它们最终到达正确的位置(不是索引,而是 x、y 位置)之前会跳来跳去。
编辑 2
int pullUpPullOver = 25; // half the height/width of the marker (to center it) ...
int offsetTop = 50 * position; // each item pushes the next down by 50 ...
int x = (location.getX() - pullUpPullOver);
int y = (location.getY() - pullUpPullOver) - offsetTop;
AbsListView.LayoutParams layoutParams = new AbsListView.LayoutParams(50, 50);
convertView.setLayoutParams(layoutParams);
convertView.setTranslationX((float) x);
convertView.setTranslationY((float) y);
我不喜欢悲伤的黑客来做这件事。考虑到 HTML/CSS 绝对和相对定位,在 Android 中是否有绝对定位元素(在容器视图内)的标准方法?