El código en sideindex-for-android es más complejo de lo que necesita ser.
Creé LinearLayout como ese ejemplo y agregué instancias de TextView para las letras. Pero luego los hice cliqueables.
En mi onClick(), veo si es una de estas vistas y obtengo el texto de ella.
Cuando cargué mi lista, configuré un diccionario en el cursoradapter. El método setSelection() obtiene el desplazamiento de este diccionario.
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;
}
puede ser esto puede ayudarle a: http://stackoverflow.com/questions/7431110/replication-of-apples-search-in-android/7442438#7442438 –