Указатель навигации Android в элементах списка - PullRequest
0 голосов
/ 26 мая 2011

Я пытаюсь создать список с указателями направления в элементах списка, как широта 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);
            }

        }
    }
}

1 Ответ

0 голосов
/ 26 мая 2011

Для внесения изменений в список вам нужно вызвать notifyDataSetChanged .. Другой альтернативы этому нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...