2011-10-10 8 views
1

J'essaye d'implémenter le AlphabetIndexer pour aider les utilisateurs à faire défiler ma liste, mais rien ne s'affiche dans la liste quand j'exécute l'application. Quelqu'un pourrait-il me dire pourquoi?Impossible de faire fonctionner AlphabetIndexer

Remarque: Je n'instancie pas un AlphabetIndexer dans le constructeur de l'adaptateur car, à ce stade, aucun curseur n'est disponible.

Voici le code correspondant:

Dans la méthode onCreate() de l'activité:

mList = (ListView)findViewById(R.id.mylist); 
mList.setOnItemClickListener(this); 
mList.setFastScrollEnabled(true); 
mAdapter = new MyAdapter(MyActivity.this, R.layout.layout_list_row, null, new String[] {MyColumns.NAME}, new int[] {R.id.itemname}); 
mList.setAdapter(mAdapter); 
mList.setFastScrollEnabled(true); 
doQuery(); 

doQuery() est une méthode qui interroge un curseur à l'aide d'un AsyncQueryHandler. Le AsyncQueryHandler ressemble à ceci:

private final class MyQueryHandler extends AsyncQueryHandler { 
    public MyQueryHandler(Context context) { 
     super(context.getContentResolver()); 
    } 
@Override 
protected void onQueryComplete(int token, Object cookie, Cursor cursor) { 
    if (!isFinishing()) { 
     if (mAdapter != null) { 
      mAdapter.changeCursor(cursor); 
     } 
    } 
    else { 
     cursor.close(); 
    } 
} 

} 

Enfin, mon SimpleCursorAdapter. J'ai pris les parties inutiles:

public class MyAdapter extends SimpleCursorAdapter implements View.OnClickListener { 

    private Cursor mCursor; 
    AlphabetIndexer alphaIndexer; 


public MyAdapter(Context context, int layout, Cursor c, String[] from, int[] to) { 
    super(context, layout, c, from, to); 
} 

public int getPositionForSection(int section) { 
    return alphaIndexer.getPositionForSection(section); 
} 

public int getSectionForPosition(int position) { 
    return alphaIndexer.getSectionForPosition(position); 
} 

public Object[] getSections() { 
    return alphaIndexer.getSections(); 
} 

public void onClick(View v) { 
    // ... 
}  

@Override 
public void bindView(View view, Context context, Cursor cursor) { 
    // ... 
} 

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 
    // ... 
} 

@Override 
public void changeCursor(Cursor cursor) { 
    super.changeCursor(cursor); 

    if (MyActivity.this.mCursor != null) { 
     stopManagingCursor(MyActivity.this.mCursor); 
     MyActivity.this.mCursor.close(); 
     MyActivity.this.mCursor = null; 
     mCursor = null; 
    } 
    MyActivity.this.mCursor = cursor; 
    startManagingCursor(MyActivity.this.mCursor); 
    mCursor = cursor; 
    alphaIndexer = new AlphabetIndexer(mCursor, mCursor.getColumnIndex(MyColumns.NAME), " ABCDEFGHIJKLMNOPQRSTUVWXYZ"); 
    alphaIndexer.setCursor(mCursor); 
} 

@Override 
public Cursor runQueryOnBackgroundThread(CharSequence constraint) { 
    return doQuery(); 
} 

}

+0

Je fais quelque chose de similaire ICI http://stackoverflow.com/questions/10224233/alphabetindexer-with-custom-adapter-managed-by-loadermanager – toobsco42

Répondre

3

Parfois Android cachera la fonctionnalité de défilement rapide si votre liste n'est pas assez longtemps pour justifier le défilement rapide. Je ne sais pas si c'est votre problème, mais il pourrait être utile d'essayer d'ajouter un tas d'éléments à la liste.

1

Je viens de perdre quelques heures sur l'indexeur d'alphabet et le défilement rapide. Dans mon cas, la liste n'était pas toujours assez longue pour justifier la fonction de défilement rapide de l'indexeur alphabétique. Le comportement exact peut être trouvé dans la classe FastScroller qui est une classe d'assistance pour AbsListView. nombre Il y a un morceau de code là-bas qui décide si « la liste est longue »

final boolean longList = childCount > 0 && itemCount/childCount >= MIN_PAGES; 

MIN_PAGES est défini avec la valeur de 4. Il vous en avez, si votre nombre d'éléments de la liste ne sont pas au moins 4 fois l'enfant (lignes visibles) scroller rapide et donc indexeur alphabet n'apparaîtra pas.

Questions connexes