2

Je voudrais avoir l'effet de cliquer sur une ligne dans un ListView et des boutons d'offre pour faire des modifications de base avec ce que j'affiche sur cette ligne. Maintenant, je ne veux pas changer exactement un textview en une editable-textview, mais plutôt quelque chose qui offre juste des boutons comme "edit" et "delete" par exemple. Cela pourrait être fait avec un popup mais j'essaye d'éviter ceci, je veux que ces boutons d'action remplacent le contenu affiché de cette rangée. Au début, j'ai pensé qu'il pourrait juste avoir deux dispositions pour gonfler en rangées. Un "actif" et un normal. Au clic, il retournera juste la disposition différente pour la ligne cliquée et aura un marqueur pour indiquer quelle ligne était la ligne actuellement sélectionnée. D'abord rencontré des problèmes que je ne m'attendais pas avec les vues gonflées étant recyclés comme une liste est défilé vers le haut & vers le bas. Bien, ok, donc j'ai fait une extension de BaseAdapter pour que je puisse faire ma propre chose avec getView(). Eh bien j'ai réussi à l'obtenir pour permettre correctement le recyclage des vues (et ne pas réutiliser le "actif" où il n'était pas supposé être) cependant Je ne vois aucun moyen de le faire actualiser/recharger la mise en page alternative sauf lorsque le défilement dit rangez l'écran et rallumez-le. Il semble qu'il n'y ait aucun moyen de forcer getView() à se produire à moins qu'une ligne ne quitte l'écran et revienne.Cause onCliquez sur une ligne ListView pour proposer des options d'édition

C'est donc une question à deux têtes. Il y a-t-il un moyen de faire en sorte qu'une seule rangée permute des vues gonflées pendant qu'elles sont affichées? Et deux peut-être ma méthode de faire cela est une façon en arrière pour accomplir ce que je veux et y at-il un meilleur moyen? Merci pour votre temps!

public View getView(int position, View convertView, ViewGroup parent) { 
    View v; 
    Boolean activeExists = false; 
    if(convertView!=null && convertView.getTag()==(String) "active"){ 
     activeExists=true; } 
    if (((position==activeFlag && activeExists==true) || (position!=activeFlag && activeExists==false)) && convertView!=null) { 
     v = convertView; 
    } else if(position==activeFlag && activeExists==false){ 
     v = inflater.inflate(rowlayoutActive, parent, false); 
     v.setTag((String) "active"); 
    } else if (position!=activeFlag && activeExists==true) { 
     v = inflater.inflate(rowlayout, parent, false); 
    } else { 
     v = inflater.inflate(rowlayout, parent, false); 
    } 
    bindView(position, v); 
    return v; 
} 

(En dehors de cette getView je (int) activeFlag de se rappeler que l'on est le courant « sélectionné » et j'ai ma propre version de Bindview qui ne diffère pas vraiment beaucoup de la normale. Le booléen est une marque rapide Les vues déjà gonflées empêchent la mauvaise d'aller dans la mauvaise rangée lorsqu'elles sont recyclées.)

+1

Bonne question, et une partie de la réponse pourrait être que vous considérez le modèle MVC. Strictement parlant, vous devez modifier les données sous-jacentes pour provoquer une modification dans l'interface utilisateur qui suggère d'ajouter peut-être un booléen à vos données "isEditing" ou similaire, définissez-le avec le clic puis appelez notifyDataSetChanged. Dans getView, vous devez tester ce booléen pour utiliser la disposition appropriée. – Simon

+0

Oh mon Dieu, je me sens si bête maintenant. J'ai seulement ajouté '((myCustomBaseAdapterAsACast) myListVarName) .notifyDataSetChanged()' et il a immédiatement échangé les vues onClick. Je n'ai pas eu à éditer quoi que ce soit sur mon adaptateur personnalisé, apparemment cela fonctionne comme je le pensais. Je sais que j'avais déjà consulté notifyDataSetChanged et similaire mais cela ne fonctionnait pas avant, je sais pourquoi maintenant. J'ai fait un plâtre à mon adaptateur et cela a fonctionné, mais sans rien je n'ai rien. 'myListVarName.notifyDataSetChanged()' Bullocks, vous n'obtenez rien. '((myCustomBaseAdapterAsACast) myListVarName) .notifyDataSetChanged()' A travaillé immédiatement. – cgv

+0

J'accepterais votre commentaire comme réponse, mais il n'a pas été posté en réponse. Si vous le recopiez, je l'accepterai, merci. Je pense que j'étais juste coincé et un peu frit au cerveau. – cgv

Répondre

1

Bonne question, et une partie de la réponse pourrait être que vous considérez le modèle MVC. Strictement parlant, vous devez modifier les données sous-jacentes pour provoquer une modification dans l'interface utilisateur qui suggère d'ajouter peut-être un booléen à vos données "isEditing" ou similaire, définissez-le avec le clic puis appelez notifyDataSetChanged. Dans getView, vous devez tester ce booléen pour utiliser la disposition appropriée.

Questions connexes