Не выводит первую строку в list view

242
11 ноября 2017, 11:08

Имеется такой вот код, он выводит информацию из SQLite в лист. И все работает, нооо.. самая первая запись не выводится, оно ее просто пропускает и начинает со второй

  final SQLiteDatabase sqLiteDatabase = dataBase.getReadableDatabase();
      Cursor cursor = sqLiteDatabase.query("Messeg",null,null,null,null,null,null);
      if(cursor.moveToFirst()){
         // while (cursor.moveToNext()){
        while (cursor.moveToNext()){
              UpList.add(0, new DialogSaveData(
                     cursor.getString(cursor.getColumnIndex("fr")),
                    cursor.getString(cursor.getColumnIndex("fr")),
                     cursor.getString(cursor.getColumnIndex("data"))
             ));
   CastomDialog adapter = new CastomDialog(MainActivity.this, R.layout.castom_dialog_list, UpList);
              //присваиваем адаптер списку
              listChat.setAdapter(adapter);
               adapter.notifyDataSetChanged();

          }
       }else {
          dataMess.setText("no table");
       }

   }

Путем тыка подозрение пало на строку while (cursor.moveToNext()){ т.к если убрать этот цикл то в лист выведется только первая запись. Подскажите пожалуйста, как это можно исправить?

Answer 1

Изначально Cursor стоит на позиции ДО первой записи.

В строке

if(cursor.moveToFirst()){

вы его передвигаете на первую запись, и следующий сразу за ним

while (cursor.moveToNext()){

передвигает его на вторую запись.

В Вашем случае строка

if(cursor.moveToFirst()){

не нужна, а для обработки проблемы с пустым результирующим набором сделайте проверку на количество элементов в UpList после цикла

Answer 2

Присваивайте первый элемент до входа в цикл while().

1) cursor.moveToFirst();
2) присвоить первый элемент в list
3) цикл cursor.moveToNext() по остальным элементам курсора.

Answer 3

А такой вариант

final int record = cursor.getCount(); // Количество записей в таблице базы данных

final int columnCount = cursor.getColumnCount(); // Количество полей в таблице

    cursor.moveToFirst();
    test = new ArrayList<>();
    if (record == 0) {
        Toast toast = Toast.makeText(ReadRecorsDB.this, "Записи в базе   отсутствую, добавьте новую запись", Toast.LENGTH_LONG);
        toast.show();
    } else> 
    {
        while (!cursor.isAfterLast()) {
            test.add(cursor.getString(i));
            i++;
            if (i == columnCount) {
                cursor.moveToNext();
                i = 0;                       
                }   
    cursor.close();
READ ALSO
Сервлет отрабатывает 2 или более раз

Сервлет отрабатывает 2 или более раз

Сайт написан на чистых сервлетах, никаких фреймворков не используетсяПри открытии любой страницы сервлет этой страницы отрабатывает 2 раза

209
Считывание Aztec кода на Android

Считывание Aztec кода на Android

Господа программисты, кто то сможет подсказать по считыванию штрих-кода? Как в приложении Сбербанка сделали считывание квитанции по налогам?

140
Работа с реализацией Validator

Работа с реализацией Validator

У меня есть такой валидатор:

151
docker arp сканирование.

docker arp сканирование.

Имеется микросервисное приложениеОдин из сервисов производит arp сканирование окружающей локальной сети с помощью скрипта

165