Aller au contenu

[résolu] listview et raffraichissement ( j'ai utilisé une autre solution )


letroll

Recommended Posts

Bonjour,

Eh bien moi j'ai un problème plus ou moins récurrent, j'ai une application avec une listview et je voudrais qu'après un ajout dans celle-ci, elle se met à jour. J'ai donc parcourus le forum et vue qu'apparement il fallait utiliser

notifyDataSetChanged(), le truc c'est que je débute, et ne trouve pas où le placer! Je pensais qu'il fallait le placer dans mon activityforResult() mais rien ne se passe :(

Edit: j'utilise un baseAdapter mais je ne connais pas trop la différence entre les différents types d'adapter, et apparemment c'est problèmatique d'utiliser notifyDataSetChanged() avec un baseAdapter. Quelqu'un y arrive quand même? je peux changer d'adapter sans inconvénient?

Pour résumer un peu le problème:

J'ai une activité principale qui contient une listview, un adapter qui hérite d'un baseAdapter. A un clique sur une occurrence du listview, j'ouvre une activité qui me fais la sauvegarde d'une note, hop appuis sur retour, pas de mise à jour.

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Je ne sais pas si tu as résolu ton problème mais l'utilisation de notifyDataSetChanged avec un BaseAdapter fonctionne normalement très bien n'importe ou dans le code.

Au vue de ta description, je pencherai plus pour un problème de sauvegarde des données. Peux-tu publier le code de ton activity si tu veux plus d'aide ?

Bon courage,

ichpa

Lien vers le commentaire
Partager sur d’autres sites

alors pour ce qui est de mon activité principale en gros:

public class Main extends Activity implements OnItemClickListener, OnItemLongClickListener {
   ArrayList Notes = new ArrayList();
   static String path =Environment.getExternalStorageDirectory().toString()+"/data/andropad2/";
   File[] mesSources;
   ListView list;
   myAdapter adpt;
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);

       File monDossier= new File(path);
       if (monDossier.list()!=null){
           mesSources = monDossier.listFiles(new FilenameFilter(){ 
               @Override 
               public boolean accept(File dir, String name) 
               { 
               return ( (name.endsWith(".txt")) || (name.endsWith(".php")) || (name.endsWith(".css")) || (name.endsWith(".js")) || (name.endsWith(".html")) ); 
               } 
               }); 
       }
       if (mesSources!=null){
           int i = 0;
           while (i                Notes.add(new Note(mesSources[i].getName().toString(),""));
               i++;
           }
       }

       //Notes.add(new Note ("orange","fruit rond"));

       list = (ListView) this.findViewById(R.id.ListViewNotes);
       adpt = new myAdapter(this,Notes);
       list.setAdapter(adpt);
       list.setOnItemClickListener(this);
       list.setOnItemLongClickListener(this);

   }
   protected void onActivityResult(int requestCode, int resultCode, Intent data) {
       if(requestCode==1000){
           Toast.makeText(this, "test", Toast.LENGTH_SHORT).show();
           adpt.notifyDataSetChanged();
       }
       super.onActivityResult(requestCode, resultCode, data);
   }
}

Ensuite pour mon adapter:

public class myAdapter extends BaseAdapter {

   private ArrayList Notes;
   private LayoutInflater myInflater;

   public myAdapter (Context context, ArrayList _Notes)
   {
       this.myInflater = LayoutInflater.from(context);
       this.Notes = _Notes;
   }

   @Override
   public int getCount() {
       return this.Notes.size();
   }

   @Override
   public Object getItem(int arg0) {
       return this.Notes.get(arg0);
   }

   @Override
   public long getItemId(int position) {
       return position;
   }

   public static class ViewHolder {
       TextView text01;
       TextView text02;
   }

   @Override
   public View getView(int position, View convertView, ViewGroup parent) {
       ViewHolder holder;

       if (convertView == null)
       {
           convertView = myInflater.inflate(R.layout.listnote, null);
           holder = new ViewHolder();
           holder.text01 = (TextView) convertView.findViewById(R.id.TextViewTitre);
           holder.text02 = (TextView) convertView.findViewById(R.id.TextViewTexte);
           convertView.setTag(holder);
       } else {
           holder = (ViewHolder) convertView.getTag();
       }

       holder.text01.setText(Notes.get(position).titre);
       holder.text02.setText(Notes.get(position).texte);

       holder.text01.setTextSize(2, 25);
       holder.text02.setTextSize(2, 20);
       holder.text02.setTextColor(Color.BLUE);


         // Changement de la couleur du fond de notre item
         if (position%2 == 0) {
           convertView.setBackgroundColor(Color.DKGRAY);
         } else {
             //convertView.setBackgroundColor(Color.MAGENTA);
         }

       return convertView;
   }
}

Au cas il faudrait le placer à l'intérieur la classe qui me permet d'éditer et de sauvegarder une note:

public class NoteEditor extends Activity{
   ////
   SharedPreferences preferences;
   //------
   Boolean saveOnBackPress;

   //------
   EditText monTitre;
   EditText monTexte;
   boolean sauvegarde = false;
   File note = Environment.getExternalStorageDirectory();
   String Path=note.getAbsolutePath()+"/data/andropad2/";

   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.edition);

       // Initialize preferences
       preferences = PreferenceManager.getDefaultSharedPreferences(this);
       saveOnBackPress = preferences.getBoolean("actionOnBackPressDuringEdition", true);

       //----

       monTitre = (EditText)findViewById(R.id.EditText01);
       monTexte = (EditText)findViewById(R.id.EditText02);

       File monDir = new File(Path);
       monDir.mkdirs();
       File monDirExt = new File(Path+"Syntaxe");
       monDirExt.mkdirs();

       if(this.getIntent().getExtras()!=null){
           String texte= this.getIntent().getExtras().getString("monTexte");
           String titre= this.getIntent().getExtras().getString("monTitre");
           monTitre.setText(titre);
           monTexte.setText(texte);

       }else {
       monTexte.setHint("votre texte ici");
       monTitre.setHint("votre titre ici");
       }
   }

   public boolean onCreateOptionsMenu(Menu menu) {
       menu.add(0,5000,0,"enreg");
       return super.onCreateOptionsMenu(menu);
   }

   public boolean onMenuItemSelected(int featureId, MenuItem item) {
       switch (item.getItemId()) {
       case 5000:
           sauvegarde();
           break;
       default:
           break;
       }
       return super.onMenuItemSelected(featureId, item);
   }    

   @Override
   public void onBackPressed() {
       if (sauvegarde!=true && saveOnBackPress){
           sauvegarde();
       }
       super.onBackPressed();
   }



   public void sauvegarde(){
       if (note.canWrite() && !(monTexte.getText().length()==0)){
           String fic=monTitre.getText().toString().trim()+".txt";
           File monFic = new File(Path,fic);
           try {
               monFic.createNewFile();
           } catch (IOException e) {
               e.printStackTrace();
           }
           if(monFic.canWrite()){
               try {
                   FileWriter monFicWrt = new FileWriter(monFic);
                   monFicWrt.append(monTexte.getText().toString());
                   monFicWrt.flush();
                   monFicWrt.close();
                   sauvegarde=true;
               } catch (IOException e) {
                   e.printStackTrace();
               }

           }

       }
   } 
}

Lien vers le commentaire
Partager sur d’autres sites

Bonjour letroll,

J'ai regardé tes sources et donc soit je n'ai pas compris soit le problème me parait évident.

Ton construit ton BaseAdapter avec une liste de Note. Cette liste est utilisée pour construire chaque élément de ta ListView (avec la méthode getView). Cependant tu n'ajoutes jamais aucune nouvelle Note à cette liste.

Donc comment veux-tu que la ListView se mette à jour avec les nouvelles Note si elles ne sont jamais ajoutées à ton ArrayList ?

Es-tu satisfait de la solution que tu as trouvé hier, ou souhaites-tu que je t'expose la mienne ?

ichpa

Lien vers le commentaire
Partager sur d’autres sites

quand tu veux modifier le contenu de ta liste, tu dois :

- te placer dans le UI/main thread (pour empecher la liste de se rafraichir)

- modifier ton tableau/arraylist (essaye de le faire rapidement, car l'interface est bloquée pendant ce temps là)

- appeller notifyDataSetChanged()

Lien vers le commentaire
Partager sur d’autres sites

merci pour les conseils les gars, j'ai donc changé pour une listactivité mais je ne sais pas si j'ai bien fais, la taille des lignes est trop petite à mon goût et pas moyen que je trouve comment changer ça, j'ai essayé en jouant sur le "textsize" ou le height du layout mais rien à faire...

Donc je pense revenir sur la solution d'origine

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...