Как бы я использовал другой макет строки в пользовательском CursorAdapter на основе данных Cursor? - PullRequest
0 голосов
/ 04 июня 2011

Справочная информация: Я пытаюсь внедрить систему обмена сообщениями в своем приложении и пишу пользовательский CursorAdapter для отображения сообщений в ListView в окне чата. Я хочу использовать другой макет строки для входящих и исходящих сообщений (информация, которая сохраняется в строке SQLite в курсоре). Каждая строка содержит одинаковые элементы с одинаковыми идентификаторами, но они расположены по-разному.

Проблема: В настоящее время я переопределил newView() и bindView(). Когда ListView заполняется впервые, он прекрасно создает все View, проверяя каждую строку, чтобы увидеть, является ли она входящей или исходящей, и надувая нужный файл XML. Однако при прокрутке или добавлении нового сообщения в окно адаптер перезагружает View s для неправильных строк. Я бы переопределил getView(), но он не передал Cursor в качестве параметра, поэтому у меня нет возможности узнать, должна ли строка быть входящей или исходящей.

Я не ищу код, а скорее предложение элегантной реализации. Заранее спасибо!

Ответы [ 2 ]

5 голосов
/ 04 июня 2011

Вот два возможных решения:

(1) Используйте единый макет для всех элементов, который вы можете настроить при привязке, чтобы отобразить по желанию.Наиболее простым способом было бы просто иметь корневое представление - FrameLayout, который содержит N дочерних элементов для каждого из различных состояний, и вы делаете одно из них видимым, а все остальные исчезают при связывании.Конечно, вы хотите позаботиться о том, чтобы это не привело к взрыву ваших элементов в количестве представлений, которые они содержат.

(2) Реализация Adapter.getItemViewType () http://developer.android.com/reference/android/widget/Adapter.html#getItemViewType(int) для отображения представления спискао различных типах предметов, которые у вас есть, поэтому он будет перерабатывать правильный.

0 голосов
/ 04 июня 2011

Всего лишь несколько мыслей, я лично нахожу, что вся комбинация ListView и CursorAdapter будет немного ... ошибаться ... раздутое правильное слово?Будет ли проще иметь комбинацию ScrollView / LinearLayout, которая просто добавит соответствующую TextView в соответствии с запросом?

Но что касается вашего решения, так как пользователь, кажется, не может изменитьПорядок сообщений по мере их добавления, вы можете добавить поле ArrayList<String> в свой пользовательский CursorAdapter, которое будет отслеживать, являются ли сообщения входящими или исходящими.Что-то вроде:

private ArrayList<String> cursorMonitor; //"incoming" and "outgoing" as your options.

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

cursorMonitor.add(my_cursor.getString("outgoing_or_incoming"));

А затем в getView() вы можете переопределить его и использоватьcursorMonitor чтобы определить, какую разметку нужно раздувать.

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