Фон
Я искал способ иметь похожий внешний вид в поле получателей Gmail, что позволяет автоматически заполнять элементы по-настоящему круто:
Класс, встроенный в платформу Android и ответственный за это, называется " MultiAutoCompleteTextView".
Проблема
MultiAutoCompleteTextView довольно простой, но он не содержит достаточного количества образцов, учебников и библиотек, чтобы узнать, как его настроить, как в Gmail и т.д.
Я хотел бы знать, как настроить его для обработки любых данных, и что у меня будет полный контроль над ним (например, добавление, удаление и получение элементов, которые он автоматически завершил).
Что я пробовал
Я нашел следующие возможные способы его достижения:
- используйте третью библиотеку, например splitwise-TokenAutoComplete. недостаток: он очень глючит и не работает на некоторых устройствах.
- создайте свой собственный путь (как показано здесь). недостаток: займет много времени, и мне, вероятно, придется решать те же проблемы, что и в библиотеке.
- используйте код Google (найдено здесь). Недостаток: он действительно не настраиваемый.
Я решил использовать # 3 (библиотека чипов Google).
В настоящее время код для получения списка контактов, используемых в библиотеке Google:
public List<RecipientEntry> doQuery() {
final Cursor cursor = mContentResolver.query(mQuery.getContentUri(), mQuery.getProjection(), null, null, null);
final LinkedHashMap<Long, List<RecipientEntry>> entryMap = new LinkedHashMap<Long, List<RecipientEntry>>();
final List<RecipientEntry> nonAggregatedEntries = new ArrayList<RecipientEntry>();
final Set<String> existingDestinations = new HashSet<String>();
while (cursor.moveToNext())
putOneEntry(new TemporaryEntry(cursor, false /* isGalContact */), true, entryMap, nonAggregatedEntries,
existingDestinations);
cursor.close();
final List<RecipientEntry> entries = new ArrayList<RecipientEntry>();
{
for (final Map.Entry<Long, List<RecipientEntry>> mapEntry : entryMap.entrySet()) {
final List<RecipientEntry> entryList = mapEntry.getValue();
for (final RecipientEntry recipientEntry : entryList)
entries.add(recipientEntry);
}
for (final RecipientEntry entry : nonAggregatedEntries)
entries.add(entry);
}
return entries;
}
Он отлично работает, но у меня возникают трудности с добавлением элементов и их удалением.
Я думаю, что получение элементов используется при вызове "getContactIds", но об изменении элементов внутри фишек, что очень проблематично для поиска.
Например, я попытался добавить подобную функцию в "submitItemAtPosition", которая, кажется, добавляет новый объект, найденный из адаптера. Он добавляет, но отображаемое имя контакта не отображается на самом чипе.
Вопрос
После многих мыслей я решил использовать код Google.
К сожалению, как я уже писал, представление и его классы очень сильно зависят от его использования.
-
Как я могу отключить просмотр и сделать его более настраиваемым? Как я могу использовать данные любого типа вместо того, что сделал Google?
-
Как мне получить, какие элементы были введены (которые стали "фишками" ), а также удалять или добавлять элементы извне?