背景
我已经搜索了一种与 Gmail 收件人字段具有相似外观和感觉的方法,它允许以非常酷的方式自动填充项目:
内置在 Android 框架中并负责此操作的类称为“ MultiAutoCompleteTextView ”。
问题
MultiAutoCompleteTextView 非常基本,但它没有足够的示例、教程和库来了解如何像在 Gmail 等上那样自定义它。
我想知道如何自定义它以处理任何类型的数据,并且我将完全控制它(例如添加、删除和获取它已自动完成的项目)。
我试过的
我找到了实现它的下一个可能的方法:
- 使用第三个库,例如splitwise-TokenAutoComplete。缺点:它非常有问题,并且在某些设备上效果不佳。
- 创建我自己的方式(如此处所示)。缺点:需要很长时间,我可能需要处理与图书馆相同的问题。
- 使用Google 的代码(在此处找到)。缺点:它真的不是可定制的。
我决定使用#3(谷歌的芯片库)。
目前用于获取 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" 添加类似的函数,这似乎添加了从适配器中找到的新实体。它确实添加了,但联系人的显示名称并未显示在芯片本身上。
问题
想了很多之后,我决定使用谷歌的代码。
遗憾的是,正如我所写的,视图及其类对它的使用非常严格。
如何解耦视图并使其更具可定制性?我怎样才能让它使用任何类型的数据,而不仅仅是谷歌所做的?
如何获取输入了哪些项目(变成了“筹码”),并且还能够从外部移除或添加项目?