Profete162 Posté(e) 27 avril 2010 Share Posté(e) 27 avril 2010 (modifié) Salut à tous, Pour ma première GridView, je me retrouve face à un probleme assez emmerd***: il n'affiche que les 16 premiers éléments en boucle. Voici mon code et quelques explications. En général: directoryEntries est une liste de Strings représentant les fichiers dans le répertoire courant. J'aimerais afficher l'image si c'est un png et une ressource si répertoire. ( pour l'instant, code brut, je ne gere pas les exceptions et les mauvais fichiers) 1) la ligne Log.i(TAG,"position= "+ position+" path= "+path +"total= "+ directoryEntries.size()); me renvoie bien les renseignements désirés soit la position, le chemin et le total ( 82 fichiers image) 2) ceci s'arrête apres 16 éléments ( je m'arrete donc à position = 15 ) et je ne continue pas jusque 82. 3) j'ai bien 82 éléments affichés, mais ce sont les 16 premiers qui se répetent en boucle. public class ImageAdapter extends BaseAdapter{ Context mContext; //public static final int ACTIVITY_CREATE = 10; public ImageAdapter(Context context) { super(); mContext = context; } @Override public int getCount() { // TODO Auto-generated method stub return directoryEntries.size(); } public Object getItem(int position) { return position; } public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub View v; if(convertView==null){ String path=directoryEntries.get(position); Log.i(TAG,"position= "+ position+" path= "+path +"total= "+ directoryEntries.size()); LayoutInflater li = getLayoutInflater(); v = li.inflate(R.xml.icon, null); TextView tv = (TextView)v.findViewById(R.id.icon_text); tv.setText(path.substring(path.lastIndexOf("/")+1)); ImageView iv = (ImageView)v.findViewById(R.id.icon_image); if (new File(path).isDirectory()) iv.setImageResource(R.drawable.folder); else iv.setImageBitmap(BitmapFactory.decodeFile(path)); } else { v = convertView; } return v; } } Merci à tous ceux qui pourront m'aider. Edit: Je viens de voir le tres bon tuto de Neokira apres avoir posé la question, et il me semble qu'il fait la même chose quoi moi.. https://forum.frandroid.com/forum/viewtopic.php?pid=6165#p6165 Modifié 27 avril 2010 par Profete162 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
popolbx Posté(e) 27 avril 2010 Share Posté(e) 27 avril 2010 v=convertView......BIIIIIIP, tu recopie la view precedente en oubliant de la modifier :) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Profete162 Posté(e) 27 avril 2010 Auteur Share Posté(e) 27 avril 2010 Effectivement, j'avais pes bien compris cette histoire de convertview.... Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
oocieni Posté(e) 15 février 2012 Share Posté(e) 15 février 2012 Désolé de remonter ce vieux sujet, mais j'ai le même genre de problème. j'ai une gridview, et je voudrait que lors d'un "click" sur l'une des cellules, elle change de couleur. Jusque la, ca fonctionne, mais si je fais défiler la grille, j'ai des cellules qui apparaisse aussi coloré ! Comme si la "view" était recopiée ! J'ai voulu voir le poste cité plus haut, mais le lien ne fonctionne plus. merci d'avance pour votre aide ! Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 15 février 2012 Share Posté(e) 15 février 2012 Les Adapter (sur lesquels se basent les GridView, ListView, etc...) intègrent un mécanisme de recyclage des vues, pour ne pas avoir à créer autant de vues qu'ils y a d'éléments dans la liste, mais se limiter au nombre d'éléments affichables en même temps. Du coup, il faut prendre en compte ce mécanisme dans ses implémentations d'Adapter, dans la méthode getView notamment. C'était le problème exposé au début de ce post. Et sans doute aussi dans ton cas Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
oocieni Posté(e) 15 février 2012 Share Posté(e) 15 février 2012 (modifié) merci chpil, j'ai compris le problème, mais je ne comprend pas comment le résoudre ! public View getView(int position, View convertView, ViewGroup parent) { final TextView tv; final int posview=position; if (convertView == null) { tv = new TextView(context); tv.setLayoutParams(new GridView.LayoutParams(85, 85)); } else { tv = (TextView) convertView; tv.setText(""+(position+1)); tv.getBackground(); //tv.setText(""+(position+1)); tv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String requete_update="update "+Collection_courante+" set collect=1 WHERE id="+(posview+1); db.execSQL(requete_update); Toast.makeText(Grid_museum.this, "Ajout "+(posview+1)+" a "+Collection_courante,Toast.LENGTH_SHORT).show(); view.setBackgroundColor(Color.rgb(70, 130, 180)); } }); } return tv; } Modifié 15 février 2012 par oocieni Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 15 février 2012 Share Posté(e) 15 février 2012 (modifié) En déplaçant une accolade fermante dans ton code ;) public View getView(int position, View convertView, ViewGroup parent) { final TextView tv; final int posview=position; if (convertView == null) { tv = new TextView(context); tv.setLayoutParams(new GridView.LayoutParams(85, 85)); } else { tv = (TextView) convertView; } tv.setText(""+(position+1)); tv.getBackground(); //tv.setText(""+(position+1)); tv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String requete_update="update "+Collection_courante+" set collect=1 WHERE id="+(posview+1); db.execSQL(requete_update); Toast.makeText(Grid_museum.this, "Ajout "+(posview+1)+" a "+Collection_courante,Toast.LENGTH_SHORT).show(); view.setBackgroundColor(Color.rgb(70, 130, 180)); } }); return tv; } de façon à ce que ton code de modification du TextView soit executé pour chaque textView, et non uniquement pour ceux déjà créés... Modifié 15 février 2012 par chpil Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
oocieni Posté(e) 15 février 2012 Share Posté(e) 15 février 2012 (modifié) merci pour ton aide, mais j'ai toujours le même problème. Quand je clique sur la case 3, par exemple, elle devient bleue, mais si je fais défilé un peu je vois la case 28 aussi en bleue. la grille est de la forme : 1 | 2 | 3 | 4 | 5 6 | 7 | 8 | 9 | 10 11 | 12 | 13 | 14 | 15 Modifié 15 février 2012 par oocieni Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 15 février 2012 Share Posté(e) 15 février 2012 Il te manque un setBackground. Tu peux remplacer le tv.getBackground() (il sert à quoi ???) par un tv.setBackground( <la couleur par défaut de tes cases>) par ex. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
oocieni Posté(e) 15 février 2012 Share Posté(e) 15 février 2012 si je défini un tv.setBackgroundColor(Color.rgb(0, 0, 0)); il ne garde plus la cellule sur laquelle j'avais cliqué en bleu :( Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 15 février 2012 Share Posté(e) 15 février 2012 J'aurais du être plus précis; il faut que ce soit un tv.setBackgroundColor( <couleur en fonction de l'état de la case si elle 'active' ou pas ...>) Ce qui veut dire qu'il faut que tu puisses déterminer si ta case a été cochée... Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
oocieni Posté(e) 15 février 2012 Share Posté(e) 15 février 2012 c'est bon ;) merci beaucoup pour ton aide Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Rejoignez la conversation
Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.