0

带有 ArrayAdapter 的 ListView 似乎是将数据绑定到 UI 元素并访问渲染/重新渲染策略的唯一方法。

我想在图像(地图)上方绝对定位(x,y)UI元素(标记)。如果数据保持静态,我只需在 FrameLayout 中的 RelativeLayout 中使用 ImageView 并设置 RelativeLayout 的边距来更改标记的 x 和 y 位置(“简单”是一种严重的轻描淡写)。

但是,数据会每隔一段时间发生变化(标记会移动或改变颜色),我希望利用 ArrayAdapter 的 notifyDataSetChanged() 方法重新渲染标记并重新定位它们。

两个问题(可能彼此无关):

  1. 带有 ListView 的 ArrayAdapter 是绑定(当数据更改时,UI 元素重新呈现)数据到 Android 中的 UI 元素的唯一方法吗?
  2. 我可以绝对定位(想想 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 中是否有绝对定位元素(在容器视图内)的标准方法?

4

2 回答 2

1

没有 arrayadapter 不是在数据更改时绑定 UI 元素的唯一方法。更改 UI 内容是非常简单的 Java。以 TextView 为例。

public TextView tv;
//on your oncreate method
tv = (TextView) findViewById(R.id.mytextview);
//now your own function
public void onDataChange(String str){
tv.setText(str);
}
//you can call this function after you detect that data changed

是的,您可以绝对定位 ListView 的 UI 元素,但这不是推荐做法请访问此链接设计指南

于 2013-09-27T04:30:47.530 回答
0

我在这里找到了我的问题的答案Android AdapterView?

不要使用 ListView,而是以与此处所述类似的方式创建自己的扩展 AdapterView 的类(删除您/我不需要的方法)http://developer.sonymobile.com/2010/05/20/android-tutorial-制作你自己的 3d-list-part-1/

于 2013-09-29T04:47:40.710 回答