Le code de sideindex-for-android est plus complexe qu'il ne devrait l'être.
J'ai créé le LinearLayout comme cet exemple l'a fait et ajouté des occurrences TextView pour les lettres. Mais alors je les avais cliquables.
Dans mon onClick(), je vois si c'est l'une de ces vues et obtenir le texte.
Lorsque j'ai chargé ma liste, j'ai créé un dictionnaire dans l'adaptateur de curseur. La méthode setSelection() obtient le décalage de ce dictionnaire.
public static final String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
public Map<String, Integer> getAlphabetOffsets() {
HashMap<String, Integer> map = new HashMap<>();
// First initialize the dictionary with all of the letters of the alphabet.
//
for (int idx = 0; idx < alphabet.length(); idx++) {
String aLetter = alphabet.substring(idx, idx+1);
map.put(aLetter, -1);
}
int numFound = cursor.getCount();
cursor.moveToFirst();
// Now go through the products' first initials and, when an initial has not been
// found, set the offset for that letter.
//
for (int idx = 0; idx < numFound; idx++) {
String productName = cursor.getString(cursor.getColumnIndex(DB.PRODUCTS_NAME_COL));
String current;
if (productName == null || productName.equals("")) {
current = "0";
} else {
current = productName.substring(0, 1).toUpperCase();
}
// By the way, what do we do if a product name does not start with a letter or number?
//
// For now, we will ignore it. We are only putting 0-9 and A-Z into the side index.
//
if (map.containsKey(current) && map.get(current) < 0)
map.put(current, idx);
cursor.moveToNext();
}
map.put("0", 0);
int lastFound = 0;
/*
Now we deal with letters in the alphabet for which there are no products.
We go through the alphabet again. If we do not have an offset for a letter,
we use the offset for the previous letter.
For example, say that we do not have products that start with "B" or "D", we
might see:
{ "9" = 0, "A" = 1, "B" = -1, "C" = 5, "D" = -1, "E" = 10 }
After this runs, will we have:
{ "9" = 0, "A" = 1, "B" = 1, "C" = 5, "D" = 5, "E" = 10 }
This is so if we click on B, we see the list starting a "A" and see that
there are no "B" products.
*/
for (int idx = 0; idx < alphabet.length(); idx++) {
String current = alphabet.substring(idx, idx+1);
if (map.get(current) < 0) {
map.put(current, lastFound);
} else {
lastFound = map.get(current);
}
System.out.println("alphabet \"" + current + "\" = " + map.get(current));
}
return map;
}
Peut être cela peut vous aider: http://stackoverflow.com/questions/7431110/replication-of-apples-search-in-android/7442438#7442438 –