12

我需要显示 Android 中某些地方的列表ListView以及那个地方的方向。我可以通过找到位置之间的角度来做到这一点,但问题是我的客户需要在设备旋转或移动时旋转箭头。我没有找到任何可以根据传感器更改旋转箭头的解决方案。他们中的任何一个都满足这样的要求吗?请向我建议一些解决方案,以使列表在此iPhone App中显示为这样。或查看下图。

更新:

我期待任何答案,以便有助于启动以下要求。即使单独显示箭头也是受欢迎的,因此我将尝试实现以下目标。我所做的所有样品都在摇晃,并且不稳定。

在此处输入图像描述

4

2 回答 2

2

在您的传感器更改事件处理程序中,调用ListView.invalidateViews(). 这将导致 ListView 中的所有现有视图重绘。因此,如果您目前可以正确绘制列表并根据需要从传感器获取事件,那么添加此调用应该可以获得您想要的行为。

于 2013-02-06T03:47:04.713 回答
2

让您的适配器保存一组对象,其中包含您想要在每个列表项上的所有信息,包括用于箭头旋转的浮点值。

public class Place {
 private Srting name;
 private double distance;
 private float arrowAngle;

//-- etc etc--

覆盖适配器getView(),设置箭头视图的旋转:

@Override
public View getView(View currentView, int position, ViewGroup parent){
  //--inflate layout for each row, find views, set values etc etc--

  Place p = getItem(position);
  arrowView.setRotation(p.getArrowAngle());

 //--return inflated view --
}

在传感器更改时,计算每个箭头的新角度,并更新适配器中的每个数据对象。

for (int i = 0 ; i < adapter.getCount(); i++){
    Place p = adapter.getItem(i);

   //--calculate angle--

   p.setArrowAngle(newAngle);
}

adapter.notifyDataSetChanged();

这样做可以,但是传感器可能变化很快,ListView数据更新过多会导致ListView滞后,限制更新,声明一个long变量lastUpdated,在传感器变化时查看是否System.nanoTime() - lastupdated > 500,然后只调用上面的更新代码。这会将更新限制为 500 毫秒的间隔。

于 2013-02-11T05:08:02.330 回答