2009-11-11 8 views
4

J'essaie d'utiliser un ContextMenu.
Je l'ai fait avec succès pour une simple ListActivity en utilisant SimpleCursorAdapter.
Passant Je veux remplacer SimpleCursorAdapter avec CursorAdapter mais conservent encore le comportement ContextMenu, donc j'ai ajouté les deux fonctions de remplacement obligatoires Bindview et NewViewOnCreateContextMenu est invoqué avec une valeur null pour ContextMenuInfo

public View newView(Context context, Cursor cursor, ViewGroup parent) { 
    View view = mLayoutInflater.inflate(R.layout.check_row, parent, false); 
    registerForContextMenu(view); 
    return view; 
} 

Notez le registerForContextMenu qui remplace le registerForContextMenu (getListView()) dans la méthode onCreate de ListActivity. J'ai trouvé cela nécessaire pour obtenir un appel à onCreateContextMenu (...)

Tout cela fonctionne (lignes créées avec les widgets attendus, callbacks sur leur fonctionnement etc etc). Tout cela sauf que le paramètre ContextMenuInfo fourni à onCreateContextMenu (...) est maintenant nul - ce qui m'empêche d'accéder à rowId.
Existe-t-il une autre astuce à effectuer - peut-être dans la méthode bindView (...) du CursorAdapter?

Répondre

2

Je réponds à la question - mais je tiens à souligner que 'commonsware.com' a fourni les indices et la direction, voir ci-dessus.
Le problème
- L'utilisation CheckBox dans les impacts de mise en ligne sur l'utilisation des menus contextuels
- CheckedTextView est, je crois, destinés à plusieurs choix, il ne se prête pas à l'initialisation de l'état vérifié.

La solution que j'adoptai effectue les opérations suivantes
1. Utilisez CheckedTextView
2. Extension de CursorAdapter pour initialiser l'état vérifié lors Bindview (...)
Note: Ceci doit gérer l'affichage des icônes correctes aussi
3. Gérer l'état de CheckedTextView dans onListItemClick (...) et l'enregistrer dans la dBase, sans oublier de mettre à jour le curseur.

1

Ce n'est pas la bonne approche. Vous enregistrez le menu contextuel pour le ListView, pas les lignes. Appelez registerForContextMenu() à l'avant, peut-être dans onCreate() après avoir gonflé la mise en page.

+1

Je veux mettre registerForContextMenu() dans onCreate() mais cela entraîne des entrées de liste ne répondant pas aux longs clics - donc il n'y a pas d'appel à onCreateContextMenu() et donc pas de menus contextuels. La mise en place du registre newView() entraîne un rappel de onCreateContextMenu() - mais le paramètre ContextMenuInfo est maintenant nul. Cependant - avoir le registre dans newView() et onCreate() fonctionne de la même manière que onCreateContextMenu() est appelé avec une entrée valide dans ContextMenuInfo. Je ne crois pas que ce soit «juste», il doit y avoir un meilleur moyen? –

+0

"Je veux mettre registerForContextMenu() dans onCreate() mais en faisant cela, les entrées de la liste ne répondent pas aux longs clics - donc il n'y a pas d'appel à onCreateContextMenu() et donc pas de menus contextuels." Consultez http://github.com/commonsguy/cw-android/tree/master/Database/Constants/ pour un exemple de ListView et registerForContextMenu(). – CommonsWare

+0

Merci. J'ai pris cet échantillon et j'ai essayé de recréer mon problème ici plutôt que dans mon propre code - et aha! Modifiez row.xml pour que CheckBox et ContextMenus ne soient plus disponibles. Vous n'avez besoin d'aucune logique pour gérer CheckBox, ajoutez simplement ce qui suit à la fin de la ligne.xml