getview - AndroidCursorAdapter

Всем доброго времени суток
У меня возникла проблема с CursorAdapter. Во время парсинга CursorAdapter вызывается 3ри раза. Но после каждого вызова CursorAdapter, он несколько раз обращается к bindView. Как мне это устранить? Что бы запрос был лишь один, на новый, последний курсор. Заранее спасибо.

public Cursor getAll() {

    return mDb.query(MY_DATABASE, new String[] {ID, TXT,
            IMG}, null, null, null, null, null);
}

Main:

dbHelper = new DB(this);
    dbHelper.open();

public void addList(){
    c = dbHelper.getAll();
    startManagingCursor(c);
    adapter = new MyCurAdapter(MainActivity.this, c);
    gridView = (GridView) findViewById(R.id.gridview);
    gridView.setAdapter(adapter); Log.d(LOG, "setAdapter");

    }

MyCurAdapter:
public class MyCurAdapter extends CursorAdapter {

String LOG = "MyCurAdapter";

LayoutInflater inflater;

public MyCurAdapter(Context context, Cursor c) {
    super(context, c);

    Log.d(LOG, "CursorAdapter!");
}

@Override
public void bindView(View view, Context context, Cursor cursor) {
     Log.d(LOG, "txt");
     Log.d(LOG, "img");

}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {

    Log.d(LOG, "LI");

    LayoutInflater inflater = LayoutInflater.from(context);
    return inflater.inflate(R.layout.gr_item, parent, false);
}
}

Log:
01-17 17:10:15.173: D/Main!(385): AsyncTask.OnPreExecute
01-17 17:10:15.383: I/ActivityManager(78): Displayed com.simpleadapter.gridview/.MainActivity: +1s219ms 01-17 17:10:16.192: D/Main!(385): AsyncTask.OnProgressUpdate
01-17 17:10:16.192: D/MyCurAdapter(385): CursorAdapter!
01-17 17:10:16.192: D/Main!(385): setAdapter
01-17 17:10:16.192: D/MyCurAdapter(385): LI
01-17 17:10:16.245: D/MyCurAdapter(385): txt
01-17 17:10:16.245: D/MyCurAdapter(385): img
01-17 17:10:16.253: D/MyCurAdapter(385): txt
01-17 17:10:16.253: D/MyCurAdapter(385): img
01-17 17:10:16.263: D/MyCurAdapter(385): txt
01-17 17:10:16.263: D/MyCurAdapter(385): img
01-17 17:10:16.543: D/Main!(385): AsyncTask.OnProgressUpdate
01-17 17:10:16.543: D/MyCurAdapter(385): CursorAdapter!
01-17 17:10:16.563: D/Main!(385): setAdapter
01-17 17:10:16.583: D/MyCurAdapter(385): LI
01-17 17:10:16.612: D/MyCurAdapter(385): txt
01-17 17:10:16.612: D/MyCurAdapter(385): img
01-17 17:10:16.622: D/MyCurAdapter(385): txt
01-17 17:10:16.622: D/MyCurAdapter(385): img
01-17 17:10:16.633: D/MyCurAdapter(385): txt
01-17 17:10:16.633: D/MyCurAdapter(385): img
01-17 17:10:16.643: D/MyCurAdapter(385): LI
01-17 17:10:16.663: D/MyCurAdapter(385): txt
01-17 17:10:16.663: D/MyCurAdapter(385): img
01-17 17:10:16.803: D/Main!(385): AsyncTask.OnProgressUpdate
01-17 17:10:16.803: D/MyCurAdapter(385): CursorAdapter!
01-17 17:10:16.803: D/Main!(385): setAdapter
01-17 17:10:16.836: D/MyCurAdapter(385): LI
01-17 17:10:16.853: D/MyCurAdapter(385): txt
01-17 17:10:16.853: D/MyCurAdapter(385): img
01-17 17:10:16.853: D/MyCurAdapter(385): txt
01-17 17:10:16.853: D/MyCurAdapter(385): img
01-17 17:10:16.866: D/MyCurAdapter(385): txt
01-17 17:10:16.866: D/MyCurAdapter(385): img
01-17 17:10:16.873: D/MyCurAdapter(385): LI
01-17 17:10:16.894: D/MyCurAdapter(385): txt
01-17 17:10:16.894: D/MyCurAdapter(385): img
01-17 17:10:16.903: D/MyCurAdapter(385): LI
01-17 17:10:16.913: D/MyCurAdapter(385): txt
01-17 17:10:16.913: D/MyCurAdapter(385): img
01-17 17:10:16.973: D/Main!(385): AsyncTask.OnPostExecute

1 Answer

  1. Johnny- Reply

    2019-11-15

    newView и bindView - это равносильно getView у обычных адаптеров. А у них есть одна особенность - в самом начале запрашиваются три элемента (как раз их Вы и видите). Запрашиваются они для того, что бы ListView смог подобрать правильные параметры отображения (в основном - высота элемента и размеры скрола).

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

    Также в этим методах нельзя делать глобальные ссылки. Я иногда вижу такой код: в методе getView нужно подгрузить картинку в image(например это твиттер клиент). Создается AsyncTask, которому передается ссылка на этот Image и сам таск в конце работы загружает картинку в Image. Это в корне неверный метод, который приводит к трудновычислямым багам (например - картинка подгружается не в свою строку или выкидывает NPE).

Leave a Reply

Your email address will not be published. Required fields are marked *

You can use these HTML tags and attributes <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>