背景
我一直在寻找一种类似于 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所做的?
如何获取输入的哪些项目(变成了“芯片”),并能够从外部添加或删除项目?