forum frandroid - android et tablette

Aller au contenu

  • Connectez-vous avec Facebook Connectez-vous avec Twitter Connexion avec Google Connexion
  • Créer un compte
Change

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


  • Merci de vous connecter pour répondre
11 réponses à ce sujet

#1
Profete162

Profete162

    Pas de faute d'orthographe dans le pseudo, c'est voulu&a

  • Membre
  • 5722 messages
  • LieuBelgique
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..

http://forum.frandro...?pid=6165#p6165

Modifié par Profete162, 27 April 2010 - 17:18.

Non à la société gérée et uniformisée! Vive l'anarchie, ordre sans pouvoir ou plutôt fin de l'ordre imposé par un pouvoir, soit non-ordre, explosion, enrichissement, émulation de tout ce que la vie peut créer de positif, sans disctinction, exponentielle vitale. Vive l'explosion des comportements!

#2
popolbx

popolbx

    Android no-life

  • Membre
  • 2470 messages
  • LieuBordeaux
v=convertView......BIIIIIIP, tu recopie la view precedente en oubliant de la modifier :)

#3
Profete162

Profete162

    Pas de faute d'orthographe dans le pseudo, c'est voulu&a

  • Membre
  • 5722 messages
  • LieuBelgique
Effectivement, j'avais pes bien compris cette histoire de convertview....
Non à la société gérée et uniformisée! Vive l'anarchie, ordre sans pouvoir ou plutôt fin de l'ordre imposé par un pouvoir, soit non-ordre, explosion, enrichissement, émulation de tout ce que la vie peut créer de positif, sans disctinction, exponentielle vitale. Vive l'explosion des comportements!

#4
oocieni

oocieni

    Membre régulier

  • Membre
  • 137 messages
  • Modèle:HTC Sensation
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 !
HTC Sensation / Tablet CT1002

#5
chpil

chpil

    RdS Développement

  • Responsable de section
  • 731 messages
  • LieuRennes
  • Modèle:ZTE Blade - Nexus 7 - Minix X5
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

#6
oocieni

oocieni

    Membre régulier

  • Membre
  • 137 messages
  • Modèle:HTC Sensation
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, 15 February 2012 - 11:18.

HTC Sensation / Tablet CT1002

#7
chpil

chpil

    RdS Développement

  • Responsable de section
  • 731 messages
  • LieuRennes
  • Modèle:ZTE Blade - Nexus 7 - Minix X5
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, 15 February 2012 - 11:50.


#8
oocieni

oocieni

    Membre régulier

  • Membre
  • 137 messages
  • Modèle:HTC Sensation
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, 15 February 2012 - 12:07.

HTC Sensation / Tablet CT1002

#9
chpil

chpil

    RdS Développement

  • Responsable de section
  • 731 messages
  • LieuRennes
  • Modèle:ZTE Blade - Nexus 7 - Minix X5
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.

#10
oocieni

oocieni

    Membre régulier

  • Membre
  • 137 messages
  • Modèle:HTC Sensation
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  :(
HTC Sensation / Tablet CT1002

#11
chpil

chpil

    RdS Développement

  • Responsable de section
  • 731 messages
  • LieuRennes
  • Modèle:ZTE Blade - Nexus 7 - Minix X5
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...

#12
oocieni

oocieni

    Membre régulier

  • Membre
  • 137 messages
  • Modèle:HTC Sensation
c'est bon ;) merci beaucoup pour ton aide
HTC Sensation / Tablet CT1002




1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)

Skimlinks