Я пытаюсь создать список с указателями направления в элементах списка, как широта gooing:
http://www.eurodroid.com/pics/android_google_maps_latitude_update_2.png
У меня уже есть рабочий код, но я беспокоюсь о производительности.
Каждый раз, когда датчик ориентации (это много), код перестраивает весь список с помощью адаптера списка, когда я хочу только повернуть изображение указателя направления, поэтому он выполняет то же самое, что и вызов notifyDataSetChanged.
Я попытался посмотреть, что произойдет, если я вызову только setText () при каждом изменении датчика, я обнаружил, что тогда он не перестраивает весь список.
public class SensorWatcher{
private SensorManager mgr = null;
public float azimuth = 0;
private Main main;
SensorWatcher(Main mainContext){
main = mainContext;
mgr = (SensorManager)mainContext.getSystemService(Context.SENSOR_SERVICE);
mgr.registerListener(listener, mgr.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_UI);
}
private SensorEventListener listener = new SensorEventListener() {
int newAzimuth;
public void onSensorChanged(SensorEvent e) {
if (e.sensor.getType()==Sensor.TYPE_ORIENTATION) {
newAzimuth = Math.round(e.values[0]);
if(newAzimuth != azimuth){
azimuth= newAzimuth;
updateItems();
//main.adapter.notifyDataSetChanged();
}
}
}
@Override
public void onAccuracyChanged(Sensor arg0, int arg1) {
// TODO Auto-generated method stub
}
};
public void updateItems(){
ListView list = main.list;
ImageView img;
View listItem;
if(list != null){
for(int i =list.getFirstVisiblePosition();i<=list.getLastVisiblePosition();i++ ){
if(i< list.getChildCount()){
listItem=(View) list.getChildAt(i);
//listItem = list.getAdapter().getView(i, null, null);
img =(ImageView) listItem.findViewById(R.id.allowtest);
Bitmap bmp = BitmapFactory.decodeResource(main.getResources(), R.drawable.arrowup);
Matrix mtx = new Matrix();
mtx.postRotate(calculateDirection(list,i));
Bitmap rotatedBMP = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), mtx, true);
BitmapDrawable bmd = new BitmapDrawable(rotatedBMP);
img.setImageDrawable(bmd);
}
}
}
}