Есть несколько вариантов того, чего вы пытаетесь достичь. Лично я бы порекомендовал реализовать свой собственный Адаптер (скорее всего, в этом случае, расширяя 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);
}