Aller au contenu

[RESOLU] AutoCompleteTextView modifiable ?


Invité

Recommended Posts

Salut,

Voilà je me pose une question. Je viens de créer un zone de saisie de texte de type AutoCompleteTextView.

C'est bien pratique, mais je me demande si c'est possible que l'utilisateur puisse ajouter des mots à mon fichier ressource si celui qu'il vient de saisir n'est pas dans mon ArrayAdapter.

J'ai essayé d'écrire un bout de code, mais ça fait planter l'appli :

//Load AutoCompleteTextView for description,
       AutoCompleteTextView textView = (AutoCompleteTextView)findViewById(R.id.descriptionText);
       String[] descriptions = getResources().getStringArray(R.array.description);
       ArrayAdapter adapter = new ArrayAdapter(this, R.layout.list_item, descriptions);
       textView.setAdapter(adapter);

Mon fichier array est le suivant (C'est juste un test, ne faites pas attention aux items :P )


Car
Tree
River
Sea
Ocean
Mountain
Bike

Enfin je fais un test sur le mot qui vient d'être entré par l'utilisateur, et s'il ne fait pas partie des items cités ci-dessus, je l'ajoute. Ainsi, mon but est d'enrichir la "banque" de mots. Un peu comme avec le dictionnaire SMS où l'on peut ajouter nos mots :

( description c'est le string écrit dans la zone de saisie, et descriptions c'est mon champ de strings qui contient les items de mon fichier ressource )

// Check if description is not null and if it's a description
               // which is not in the array. In that case, we save the description
               // in order to use it with the AutoCompleteTextView :
               if(description.length() > 0){
                   ArrayList list = new ArrayList();
                   String[] descriptions = getResources().getStringArray(R.array.description);
                   ArrayAdapter adapter = new ArrayAdapter(getApplicationContext(),R.layout.list_item,  descriptions);
                   int isInArray = 0 ; 
                   int j = descriptions.length;
                   for (int i=0; i < j; i++){
                       if (adapter.getItem(i) == description){
                           isInArray =1;                            
                       }                        
                   }
                   if (isInArray == 0){ // That's mean that the description is not in the Array, so we have to add it
                       adapter.add(description);
                   }
               }

Voilà pour le code.

Pour ce qui est du message d'erreur, c'est :

E/AndroidRuntime( 5917): java.lang.UnsupportedOperationException
E/AndroidRuntime( 5917):        at java.util.AbstractList.add(AbstractList.java:
410)

etc ...

J'y ai un peu réfléchi, et déjà je me demande si ça ne serait pas mieux de créer tout simplement une base de donnée. Je récupèrerai les mots dans un String[] que j'enverrai ensuite dans mon ArrayAdapter.

Parce que là de toute façon, je me dis qu'au prochain lancement de l'appli, mon fichier de ressources n'aura pas été modifié si ?

Bref je suis un peu paumé ... :/

Lien vers le commentaire
Partager sur d’autres sites

Nop ton fichier de ressources restera le même (à moins d'en réécrire un complètement mais bon :/)

Ton idée de créer une BDD est bonne, au moins tu pourras gérer les mots plus facilement

Tu peux partir de ton fichiers de ressources (pour avoir une base) et y ajouter les mots de la BDD que tu auras créé :)

Lien vers le commentaire
Partager sur d’autres sites

Ouais c'est ce que j'ai fait.

Ça marche bien. Il faut juste que je gère les doublons maintenant.

Je lâcherai peut être le code si j'y pense ;)

Lien vers le commentaire
Partager sur d’autres sites

je ne sais pas si tu sais / as fais, mais si tu passe par une base de données pour alimenté ton ListView, tu peux utilisé un CursorAdapter ;)

(je dis ça au cas où pour les autres personnes en quête de réponse qui passerait dans le coin ;))

Lien vers le commentaire
Partager sur d’autres sites

Non j'utilise pas encore une ListView, mais ça va pas tarder vu que je vais créer une activity qui va s'occuper de permettre à l'utilisateur de voir tous les mots qu'il a enregistrer, et lui permettre d'en supprimer certains.

Je pensais tout simplement reprendre l'exemple du Notepad. Simple et efficace.

Bon comme promis voici le code qui gère les doublons.

Je décris la BDD, c'est la même que celle de l'exemple du NotePad, j'ai juste changé quelques noms:

               AutoCompleteTextView descriptionEditText = (AutoCompleteTextView)findViewById(R.id.descriptionText);
               description = descriptionEditText.getText().toString();    


               // Check if description is not null and if it's a description
               // which is not in the array. In that case, we save the description
               // in order to use it with the AutoCompleteTextView :
               if(description.length() > 0){
                   mDbadapter = new DescriptionDbAdapter(Uploader.this);
                   mDbadapter.open();
                   Cursor c = mDbadapter.fetchAllDescriptions();
                   startManagingCursor(c);    
                   String desc = null;
                   int columnIndex = c.getColumnIndex(DescriptionDbAdapter.KEY_DESCRIPTION);                    
                   isInArray = 0;

                   if (c.getCount()>0){
                       Log.i(TAG, "LE NOMBRE DE DESCRIPTION EST: " + c.getCount());
                       for(int i =0 ; i < c.getCount(); i++){
                           c.moveToPosition(i);
                           desc = c.getString(columnIndex);
                           Log.i(TAG, "LA DESCRIPTION N°" + i + " EST: " + desc);
                           if(desc.equals(description) == true ){
                               Log.i(TAG,"DESCRIPTION DEJA EN BDD");
                           isInArray = 1;
                           }
                       }
                       if(isInArray == 0){
                           mDbadapter.createDescription(description);
                           Log.i(TAG,"Description ajoutée à la base de données");
                           refreshList();
                       }
                       if(isInArray == 1){                            
                           Log.i(TAG,"DESCRIPTION DEJA EN BDD");

                       }
                   }

                   if(c.getCount()==0){
                       Log.i(TAG,"IL N'Y A AUCUNE DESCRIPTION DANS LA BDD");
                       mDbadapter.createDescription(description);
                       Log.i(TAG,"Description ajoutée à la base de données");
                       refreshList();

                   }

               }

avec ma méthode refreshList() :

//-------------------------------------------------------------------------------------------
//                       Load AutoCompleteTextView with elements from database 
//-------------------------------------------------------------------------------------------

public void refreshList(){
               //Load AutoCompleteTextView for description
               mDbadapter = new DescriptionDbAdapter(this);
               mDbadapter.open();
               Cursor c = mDbadapter.fetchAllDescriptions();
               startManagingCursor(c);    
               String desc = null;
               ArrayList list = new ArrayList();
               int columnIndex = c.getColumnIndex(DescriptionDbAdapter.KEY_DESCRIPTION);
               if (c.getCount()>0){
                   Log.i(TAG, "LE NOMBRE DE DESCRIPTION EST: " + c.getCount());
                   for(int i =0 ; i < c.getCount(); i++){
                       c.moveToPosition(i);
                       desc = c.getString(columnIndex);
                       list.add(desc);           
                   }
               }
               Log.i(TAG,"LA LISTE DE DESCRIPTIONS EST: "+ list.toString());
               ArrayAdapter adapter = new ArrayAdapter(this, R.layout.list_item, list);
               descriptionEditText.setAdapter(adapter);    
   }

Voilà j'espère que ça pourra aider certains !

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...