IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants graphiques Android Discussion :

Comment rafraichir une listView contenue dans un tab?


Sujet :

Composants graphiques Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 101
    Par défaut Comment rafraichir une listView contenue dans un tab?
    Bonjour,

    Je suis en train de développer ma première appli Android après avoir fait les quelques tutos proposés par Google, et je bute sur un point.

    J'ai une tabActivity contenant 3 views, dont une listView. Mon problème est simple: Lorsque je rajoute un élément dans ma liste, le contenu du tab ne se rafraichit pas, c'est à dire que je ne vois pas le nouvel élément apparaître à l'écran.

    Par contre, si je vais sur un autre tab, puis retourne sur celui contenant ma liste, le tab est actualisé et je vois bien ma liste à jour dedans.

    En testant avec une ListActivity seulement, l'affichage se met correctement à jour en appelant la méthode notifyDataSetChanged() sur mon adapter.

    Du coup je me demande comment forcer mon tabHost (ou tabwidget ou framelayout, je ne sais pas trop) à rafraichir ma listView.

    Merci pour votre aide

  2. #2
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Bonjour,
    J'ai une tabActivity contenant 3 views, dont une listView. Mon problème est simple: Lorsque je rajoute un élément dans ma liste, le contenu du tab ne se rafraichit pas, c'est à dire que je ne vois pas le nouvel élément apparaître à l'écran.
    De mon côté ça marche , tu peux me montrer comment tu exécutes ta demande de mise à jour de ta liste, ton adapter , et comment tu remplit ta tabHost ?


    Merci .

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 101
    Par défaut
    Citation Envoyé par Feanorin Voir le message
    Bonjour,


    De mon côté ça marche , tu peux me montrer comment tu exécutes ta demande de mise à jour de ta liste, ton adapter , et comment tu remplit ta tabHost ?


    Merci .
    Alors, pour être plus précis, j'ai un bouton me permettant d'afficher un dialog contenant les contacts:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    mContactList = (ListView) findViewById(R.id.contactList);
    Button button = (Button) findViewById(R.id.addPeopleButton);
    button.setOnClickListener(new OnClickListener() {
       public void onClick(View v) {
         createContactDialog();
       }
    });
     
    mContactList.setAdapter(new ContactAdapter(this.getApplicationContext(), selectedContacts));
    Tous les contacts sont stockés dans une arrayList, et une autre arrayList contient les contacts sélectionnés. Lorsque je sélectionne un contact, je l'enlève des contacts "sélectionnables" (pour ne pas qu'on puisse le sélectionner plusieurs fois), et je le met dans ma liste de contacts sélectionnés:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    private void createContactDialog() {
      AlertDialog.Builder builder = new AlertDialog.Builder(this);
      builder.setTitle("Pick a contact:");
     
      builder.setAdapter(new ContactAdapter(this.getApplicationContext(), contactList), new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int item) {
          selectedContacts.add(contactList.remove(item));
          ((ContactAdapter) mContactList.getAdapter()).notifyDataSetChanged();
        }
      });
      AlertDialog alert = builder.create();
      alert.show();
    }
    Je déclenche la demande de maj avec notifyDataSetChanged()

    Et l'adapter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    public class ContactAdapter extends BaseAdapter implements ListAdapter {
     
      private ArrayList<Contact> contactList;
      private Context context;
      private LayoutInflater inflater;
     
      public ContactAdapter(Context context, ArrayList<Contact> contactList) {
        this.context = context;
        this.contactList = contactList;
        this.inflater = LayoutInflater.from(context);
      }
     
      @Override
      public int getCount() {
        return contactList.size();
      }
     
      @Override
      public Object getItem(int position) {
        //return contactList.get(position).getName();
        return contactList.get(position);
      }
     
      @Override
      public long getItemId(int position) {
        //return contactList.get(position).getId();
        return position;
      }
     
      @Override
      public int getItemViewType(int position) {
        return 0;
      }
     
      @Override
      public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
          convertView = new TextView(parent.getContext());
        }
        ((TextView) convertView).setText(contactList.get(position).getName());
        return convertView;
      }
     
      @Override
      public int getViewTypeCount() {
        return 1;
      }
     
      @Override
      public boolean hasStableIds() {
        return true;
      }
     
      @Override
      public boolean isEmpty() {
        return contactList.isEmpty();
      }
     
      @Override
      public void registerDataSetObserver(DataSetObserver observer) {
        // TODO Auto-generated method stub
     
      }
     
      @Override
      public void unregisterDataSetObserver(DataSetObserver observer) {
        // TODO Auto-generated method stub
     
      }
     
      @Override
      public boolean areAllItemsEnabled() {
        return true;
      }
     
      @Override
      public boolean isEnabled(int position) {
        return true;
      }
     
    }

    Pour ce qui est du tabHost, je définis mes 3 tabs dans un xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
     
            <LinearLayout android:id="@+id/tab1"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent">
            <Button android:id="@+id/addPeopleButton"
              android:layout_height="wrap_content"
              android:layout_width="fill_parent"
              android:text="@string/addPeople"/>
     
            <ListView android:id="@+id/contactList"
              android:layout_height="fill_parent"
              android:layout_width="fill_parent"/>
     
            </LinearLayout>
     
            <TextView android:text="tab2"
            android:id="@+id/tab2"
            android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
     
     
            <TextView android:text="tab3"
            android:id="@+id/tab3"
            android:layout_width="wrap_content"
          android:layout_height="wrap_content" />
     
    </FrameLayout>
    Et je l'instancie comme ça (ce qui me parait très très moche mais bon...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    TabHost tabHost = getTabHost();
    LayoutInflater.from(this).inflate(R.layout.tab_layout2, tabHost.getTabContentView(), true);
     
    TabHost mTabHost = getTabHost();
    mTabHost.addTab(mTabHost.newTabSpec("1").setIndicator("1").setContent(R.id.tab1));
    mTabHost.addTab(mTabHost.newTabSpec("2").setIndicator("2").setContent(R.id.tab2));
    mTabHost.addTab(mTabHost.newTabSpec("3").setIndicator("3").setContent(R.id.tab3));

  4. #4
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Bonjour,


    Alors ..

    Ici tu mets bien à jour ton tableau appartement à ton activity , puis tu de mandes à ta liste de se mettre à jour .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    builder.setAdapter(new ContactAdapter(this.getApplicationContext(), contactList), new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int item) {
          selectedContacts.add(contactList.remove(item));
          ((ContactAdapter) mContactList.getAdapter()).notifyDataSetChanged();
        }
      });

    Sauf que ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public class ContactAdapter extends BaseAdapter implements ListAdapter {
     
      private ArrayList<Contact> contactList;
    Le tableau que ton adapter utilise pour afficher les données n'est lui pas mis à jour .

    soit tu utilises la même variable pour ton adapter ainsi que pour ton activity , soit tu met à jour ton tableau dans ton activity lorsqu'il y a un changement .

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 101
    Par défaut
    J'instancie mon adapter a partir du tableau de mon activity:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mContactList.setAdapter(new ContactAdapter(this.getApplicationContext(), selectedContacts));
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public ContactAdapter(Context context, ArrayList<Contact> contactList) {
        this.context = context;
        this.contactList = contactList;
        this.inflater = LayoutInflater.from(context);
      }
    Du coup les 2 champs devraient pointer vers le même tableau en mémoire non?

    Edit: je viens de le vérifier en débuggant, les 2 ArrayList on le même id, donc pointent sur la même chose. Le problème doit venir d'ailleurs.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 101
    Par défaut
    Bonjour,

    J'ai trouvé la réponse à mon problème dans cet article: http://www.softwarepassion.com/andro...-and-adapters/

    Le souci venait du fait que je faisais hériter mon adapter de BaseAdapter. En héritant de ArrayAdapter, ça fonctionne déjà beaucoup mieux ! J'imagine que ça doit être faisable en héritant de BaseAdapter, mais ils doit falloir rajouter du code pour gérer correctement la mise à jour de l'UI.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PowerShell] Comment exécuter une commande contenue dans une variable ?
    Par mzawo dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 09/05/2011, 17h58
  2. Comment lire une image contenue dans un fichier PDF
    Par colorid dans le forum Langage
    Réponses: 1
    Dernier message: 15/05/2009, 19h59
  3. Réponses: 5
    Dernier message: 30/10/2008, 10h06
  4. Remplir une listview contenu dans une feuille excel
    Par pierrot53 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/11/2007, 15h59
  5. Comment afficher une valeur contenue dans une variable ?
    Par manubrard dans le forum Langage
    Réponses: 5
    Dernier message: 20/02/2006, 15h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo