Aller au contenu

Gridview ne m'affiche que les 16 premiers éléments en boucle.


Profete162

Recommended Posts

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é par Profete162
Lien vers le commentaire
Partager sur d’autres sites

  • 1 year later...

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 !

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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é par oocieni
Lien vers le commentaire
Partager sur d’autres sites

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é par chpil
Lien vers le commentaire
Partager sur d’autres sites

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é par oocieni
Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

Rejoignez la conversation

Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.

Invité
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...