Заполнение одного ListView с различными макетами строк - PullRequest
2 голосов
/ 06 мая 2011

Я пытаюсь заполнить ListView столбцом из базы данных.Я могу добиться этого успешно, но проблема в том, что я хотел бы использовать другой ресурс макета в зависимости от того, совпадает ли идентификатор с PendingIntent.

Это делается для того, чтобы проверить, существует ли тревога с rowid, и я планируюиметь визуальную обратную связь в списке, чтобы показать пользователю, какие существуют тревоги.Я могу успешно проверить rowid с PendingIntents и получить возвращаемое логическое значение.

Проблема, с которой я сталкиваюсь, заключается в заполнении ListView различными ресурсами макета для разных строк (это вообще возможно?), И я понятия не имею, гдеиди отсюда.

В настоящее время у меня есть следующий код:

for(int x = 0; x < numNotes; x++)   {

            if(existAlarm(intarray[x])){
                String[] from = new String[] { TodoDbAdapter.KEY_SUMMARY };
                int[] to = new int[] { R.id.label1};
                cursor = dbHelper.fetchTodo(intarray[x]);

                SimpleCursorAdapter notes = new SimpleCursorAdapter(this,
                        R.layout.todo_row_green, cursor, from, to);
                setListAdapter(notes); 

            } else if (!existAlarm(intarray[x])){

                String[] from = new String[] { TodoDbAdapter.KEY_SUMMARY };
                int[] to = new int[] { R.id.label};
                cursor = dbHelper.fetchTodo(intarray[x]);

                SimpleCursorAdapter notes = new SimpleCursorAdapter(this,
                        R.layout.todo_row, cursor, from, to);
                setListAdapter(notes); 
            }   

        }

Но ListView просто показывает окончательную запись базы данных из цикла.

Я был бы очень признателенЗа любые советы, спасибо.

Ответы [ 2 ]

3 голосов
/ 06 мая 2011

Конечно, будет отображаться только последний элемент.Это потому, что вы продолжаете изменять адаптер списка каждый раз, когда вы входите в цикл и выполняете.Избавьтесь от цикла.

Если я правильно понимаю, вы хотите отобразить либо зеленую строку, либо не в зависимости от задачи.Если это так, напишите свой собственный адаптер списка, который является подклассом SimpleCursorAdapter.Затем переопределите метод newView (Context context, Cursor cursor, ViewGroup parent), чтобы выбрать представление для отображения строки.Параметр cursor уже перемещен в правильную позицию, поэтому вы можете извлечь значения из БД для любых необходимых сравнений.

Например: я предполагаю (из-за fetchTodo (intarray [x])), чтовы сравниваете на основе идентификатора задачи.В этом случае ваш код может выглядеть следующим образом:

 public View newView (Context context, Cursor cursor, ViewGroup parent){
      long id = cursor.getLong(TodoDbAdapter.ROW_ID_COLUMN);
      LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
      if (existAlarm(id)){
           return inflater.inflate(R.layout.todo_row_green, null);
      } else {
           return inflater.inflate(R.layout.todo_row, null);
      }
 }

Я не знаю, правильно ли я понял ваш код, но вы можете адаптировать его под свои нужды.

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

Вполне возможно использовать разные представления в каждой строке: однако вы не можете использовать для этого стандартный SimpleCursorAdapter: вам нужно перегрузить функцию getView (). Например, в Попытка переопределить getView в SimpleCursorAdapter дает NullPointerExceptio (в сообщении есть несколько ошибок, на которые дан ответ, но основной метод верен).

Что касается показа только последнего поста, ваш код создает НОВЫЙ SimpleCursorAdapter для каждой строки, что неверно. Вы хотите использовать переопределение getView (), а затем выполнить цикл for и сравнение там.

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