Background
I've searched for a way to have a similar look & feel to the Gmail receipients field, which allows auto-filling of items in a really cool way:
The class that is built into the Android framework and is responsible for this is called "MultiAutoCompleteTextView" .
The problem
the MultiAutoCompleteTextView is quite basic, yet it doesn't hold enough samples, tutorials and libraries to get to know how to customize it like on Gmail and the likes.
I would like to know how to customize it to handle any kind of data, and that I will have full control over it (for example adding, deleting and getting the items that it has auto-completed).
What I've tried
I've found the next possible ways to achieve it:
- use a third library like splitwise-TokenAutoComplete. the downside: it's very buggy and doesn't work well on some devices.
- create my own way (as shown here). the downside: will take a long time and I will probably need to handle the same problems as of the library.
- use the code of Google (found here). The downside: it's really not customizable.
I've decided to use #3 (Google's chips library).
Currently the code for getting the list of contacts used on Google's library:
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;
}
It works fine, but I'm having difficulties adding items and deleting them.
I think that getting the items is used by calling "getContactIds" , but about modifying the items within the chips, that's very problematic to find.
For example, I've tried to add a similar function to "submitItemAtPosition" , which seems to add a new entity found from the adapter. It does add, but the display-name of the contact isn't shown on the chip itself.
The question
After a lot of thoughts, I decided to use Google's code.
Sadly, as I've written, the view and its classes are very tight to the usage of it.
How can I de-couple the view and make it much more customizable? How can I make it use any type of data instead of just what Google has done?
How do I get which items were entered (that became "chips"), and also be able to remove or add items from outside?