2012-11-04 3 views
3

J'ai un Android GridView avec un ImageView, TextView et deux Button's. La grille apparaît bien, mais je trouve qu'il est difficile de gérer les événements de bouton au sein de GridView. Je suis nouveau sur Android.Android GridView bouton gestionnaire de clic

Toute aide serait appréciée.

Merci.

+0

vous obtiendrez des réponses de bien meilleure qualité si vous postez votre code pour accompagner cela. – mango

Répondre

0

Vous devez utiliser onItemClickListener

gridview.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View v, int position, 
       long row) { 
} 

Position devrait vous dire au sujet de l'élément cliqué. Mais je pense que gridview a des problèmes pour manipuler des objets avec des clicklisteners (comme des boutons). Peut-être que cela changerait mieux gridview pour un autre conteneur. Si vous avez besoin de gridview, vous pouvez utiliser setOnTouchListener pour afficher la position dans l'écran et créer un manuel onitemclicklistener.

10

Si vous voulez que les boutons (et quoi que ce soit d'autre) d'avoir des actions de clic uniques dans votre mise en page, vous devez écrire un adaptateur personnalisé et passer outre getView():

public MyAdapter(Context context, List<T> objects) { 
    ... 
    inflater = (LayoutInflater) context.getSystemService(LAYOUT_INFLATER_SERVICE); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    if(convertView == null) { 
     // Inflate and initialize your layout 
     convertView = inflater.inflate(R.layout.grid_item, parent, false); 
     holder = new ViewHolder(); 
     holder.btnOne = (Button) convertView.findViewById(R.id.btnOne); 
     holder.btnOne.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // Do something 
      } 
     }); 
     // etc, etc... 
     convertView.setTag(holder); 
    } 
    else 
     holder = (ViewHolder) convertView.getTag(); 

    // Do things that change for every grid item here, like 
    holder.textOne.setText(getItem(position));   
    return convertView; 
} 


class ViewHolder { 
    Button btnOne; 
    TextView textOne; 
} 

Ce concept a été expliqué très bien dans divers Google parle au fil des années, here is one.


Addition

Je suis en train de composer un texte de la TextView dans la colonne GridView à cliquant sur le bouton à l'intérieur GridView.

Vous devriez pouvoir accéder à un mode d'affichage dans la mise en page d'une méthode onClick() en demandant la mère de vue, puis obtenir le ViewHolder:

public void onClick(View v) { 
    ViewHolder holder = (ViewHolder) ((View) v.getParent()).getTag(); 
    // Do something with holder.textOne now 
} 

(Cela suppose que votre mise en page n'a pas ViewGroups imbriqués, donc ajuster en conséquence.)

+0

Merci pour votre réponse. J'essaye de placer le texte de TextView dans la colonne de GridView en cliquant sur le bouton à l'intérieur de GridView. Je suis incapable d'obtenir la référence du TextView. J'ajoute le code getView de mon adaptateur. – user1404963

+0

J'ai ajouté un exemple pour référencer n'importe quelle autre disposition dans le ViewHolder d'un enfant. Faites-moi savoir si cela aide. – Sam

+0

Merci Sam.Cela a vraiment aidé! L'événement OnItemClick de mon GridView ne se déclenche pas. Est-ce à cause des boutons à l'intérieur de GridView? – user1404963

3

Soit la mise en écoute Surclic intérieur adaptateur et écouter le même clic, comme cela est expliqué dans le following blog

intérieur adaptateur

holder.okay_button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      ((GridView)parent).performItemClick(v,position,0); 

     } 
    }); 
holder.cancel_button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      ((GridView)parent).performItemClick(v,position,0); 

     } 
    }); 

dans le fichier java.

gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int  position, long id) { 
      switch(view.getId) 
     { 
     case R.id.okay_button: 
      //do your stuff 
      break; 
     case R.id.cancel_button: 
      //do your stuff 
      break; 
      } 
    }); 

Remarque: si vous utilisez plus d'un clic de l'élément enfant auditeur, cas d'utilisation du commutateur pour vérifier quel élément est cliqué dans SetOnItemClickListener.Because Utiliser si d'autre déclenche tous les auditeurs de clic que vous avez dans votre adaptateur. si une bonne solution pour cela est là, faites le moi savoir. Merci.

+1

C'est une aide précieuse! Et le blog auquel vous êtes lié est formidable, merci. – Fattie

Questions connexes