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