Добавить дополнительный элемент в адаптер курсора android
У меня есть курсор, содержащий все строки из моей базы данных. Этот Курсор я передаю в CursorAdapter и покажу данные в списке. Но мне нужно показать один дополнительный элемент в начале. Как я могу это сделать?
Я где-то читал, что, возможно, это может быть сделано с помощью CursorWrapper, и он может вводить дополнительные значения в результаты. Но я не совсем уверен, как это сделать.
Если кто-то может показать мне пример (код), или есть другая идея, как это решить, сообщите мне. спасибо!
Ответы
Ответ 1
Вы можете использовать представление списка addHeaderView() или addFooterView():
TextView label = new TextView(context);
label.setText("Something Here");
listView.addHeaderView(label);
Просто не забудьте сделать это, прежде чем называть setAdapter()
.
Ответ 2
Как насчет использования комбинации MergeCursor
и MatrixCursor
, как я предложил в этом вопросе: Как вставить дополнительные элементы в SimpleCursorAdapter или Cursor для Spinner?
Ответ 3
Заменить getCount следующим образом:
@Override
public int getCount() {
final int count = super.getCount();
return count+1;
}
и кто когда-либо использует адаптер, получает одну дополнительную строку. Просто не забудьте обработать это в getView, т.е.
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(position == 0) {
final View v = inflater.inflate(R.layout.special_suggestion, parent,false);
final TextView tv = (TextView) v.findViewById(android.R.id.text1);
tv.setText("Search for '" + this.keyword + "'");
return v;
}
else {
try {
return super.getView(position, convertView, parent);
}
catch (IllegalStateException e) {
Log.e(TAG, "IllegalStateException: " + e);
}
}
return inflater.inflate(this.layout, parent,false);
}
Ответ 4
Вы можете читать данные из Cursor
в List<YourRow>
, где YourRow
- это класс для данных из вашей строки курсора. Затем просто добавьте новый элемент YourRow
в список и используйте BaseAdapter
для вашего ListView
. Прочитайте этот, чтобы узнать, как бороться с BaseAdapter
.
Ответ 5
Я решил решить эту проблему, добавив дополнительный элемент в базу данных. Это было самое простое решение, потому что вначале мне нужен дополнительный элемент. Поэтому после создания моей базы данных я вставляю строку в таблицу, для которой мне нужен дополнительный элемент, со значениями, которые я хочу.
Я также нашел это обсуждение [https://groups.google.com/forum/?fromgroups=#!topic/android-developers/QSOGjgL8kXI], поэтому, если у кого-то есть аналогичная проблема, это будет отправной точкой. спасибо!
Ответ 6
В адаптере вы можете, вероятно, показать дополнительные данные в методе getView
. Но это зависит от того, откуда поступают данные, что вы хотите с ним делать (просто отобразите?) И т.д.
Ответ 7
Аналогично добавлению дополнительного поля в базу данных, вы можете добавить дополнительное поле к проекции из базы данных. Это экономит вам немного места в вашем db и уменьшает избыточность информации. Это означает, что поле повторно вычисляет каждый доступ, а не просто сохраняется.
Вот пример проекции, который я использовал для форматирования стоимости, основанной на цене предмета (хранящегося в центах) и связанного с ним элемента.
public static final String CONCATE_COST
= "'$' || CASE WHEN SUBSTR(ROUND("+COLUMN_PRICE
+"/100.0, 2), LENGTH(ROUND("+COLUMN_PRICE
+"/100.0, 2))-1, 1)='.' THEN ROUND("+COLUMN_PRICE
+"/100.0, 2) || '0' else ROUND("+COLUMN_PRICE
+"/100.0, 2) end || "+COLUMN_UNIT;
Используйте это как столбец для перехода к вашему списку, и вы можете напрямую связать его с полем в вашем представлении.
Ответ 8
В таких случаях мое решение заключается в выполнении запроса UNION со статическими значениями. EX:
(Выберите -1 как id, "ЗДЕСЬ ИДЕТ ИМЯ" как имя, "ЗДЕСЬ ИДЕТ АДРЕС" в качестве адреса)
UNION
(Выберите идентификатор, имя, адрес из списка контактов по имени)
(синтаксис doublecheck, пожалуйста, я делаю по памяти)
Таким образом, вы получаете первую строку с -1 | ЗДЕСЬ ИДЕТ ИМЯ | ЗДЕСЬ ИДЕТ АДРЕС плюс остальные строки
Итак, вы не "загрязняете" базу данных и легко включаете/выключаете первую строку с условиями и играете с конкатенациями.