Android: компас + расстояние в списке - PullRequest
10 голосов
/ 30 сентября 2010

Полагаю, вы все пробовали "Google Адреса" в Картах. Это список ближайших к вам POI.

Я действительно хотел бы сделать ту же функцию в своем приложении со списком координат GPS, но это кажется действительно сложным.

Создание списка с расстоянием и маленькой стрелкой очень легко, но я не могу понять, как обновлять этот список и стрелку каждый раз, когда пользователь перемещает свой телефон.

Пока у меня есть статический просмотр списка.

alt text

Я хотел бы знать, если кому-то удастся создать такой просмотр списка.

Большое спасибо за любую информацию.

1 Ответ

10 голосов
/ 10 октября 2010

Есть несколько вариантов того, чего вы пытаетесь достичь. Лично я бы порекомендовал реализовать свой собственный Адаптер (скорее всего, в этом случае, расширяя SimpleCursorAdapter) и инкапсулируя обновления для расстояния между текстом и поворотом направления компаса в этом.

Чтобы помочь с управлением ресурсами, вы, вероятно, захотите создать SensorListener и LocationListener в Activity, в которой будет размещен ListView. Всякий раз, когда вы получаете обновление, вызывайте свой прокрученный метод updateCompassAndLocation из своего класса Adapter.

Из этого метода у вас есть два варианта. Либо выполните итерацию по каждому из элементов, составляющих представляемый сбор данных, и измените графическое изображение компаса и текст расстояния, либо просто запишите текущее местоположение и заголовок как переменные в классе, и вызовите notifyDataSetChanged, чтобы заставить адаптер обновить просматривает себя в методе getView. В любом случае (особенно в последнем) вам нужно установить расстояние текста и значения компаса заголовка в getView.

@Override
public View getView(int position, View convertView, ViewGroup parent) {
  LinearLayout myView;

  MyPOI item = getItem(position);

  Location poiLocation = item.getLocation;

  int compassHeading = // Calculate heading relative to current heading
  float distance = // Calculate distance to POI


  if (convertView == null) {
    myView = new LinearLayout(getContext());
    String inflater = Context.LAYOUT_INFLATER_SERVICE;
    LayoutInflater vi = (LayoutInflater)getContext().getSystemService(inflater);
    vi.inflate(resource, myView, true);
  } else {
    trainView = (LinearLayout) convertView;
  }

  TextView distanceView = (TextView)trainView.findViewById(R.id.distance);
  ImageView compassView = (ImageView)trainView.findViewById(R.id.compass);

  distanceView.setText(String.valueOf(distance);
  compassView.setImageLevel(compassHeading);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...