web-dev-qa-db-fra.com

OnItemClickListener non déclenché sur Android GridView

J'ai un Gridview rempli par un adaptateur qui renvoie LinearLayouts, chacun contenant un ImageButton et un TextView.

Dans l'adaptateur, je lie un événement onClick et onLongClick à ImageButton.

J'essaie de lier OnItemClickListener au gridview mais je ne sais pas pourquoi le onItemclicked ne s'est jamais allumé.

C'est ma 6ème heure sans rien.

Au fait, OnItemSelectListener fonctionne parfaitement sur la grille.

Je vérifie si un morceau de code gère accidentellement le onItemClicked mais ne peut pas encore l'attraper.

J'ai besoin d'aide les gars.

gridView = (GridView) layoutInflater.inflate(R.layout.gridview, null);
gridView.setOnItemClickListener(new ItemClickListener());
. 
.
.

//inner handler class
class ItemClickListener implements AdapterView.OnItemClickListener {
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
        Toast.makeText(mainActivity.getApplicationContext(),view + " clicked at pos " +            
        i,Toast.LENGTH_SHORT).show();
    }
}
27
Olgun Kaya

N'utilisez pas d'objets cliquables dans la grille. Dans ce cas, Android ne peut pas gérer l'événement de clic de GridView.

A la place, utilisez quelque chose pour afficher une vue similaire de l'interface utilisateur. Puis gérez les actions de clic de cet objet.

Ne pas: mettre Button dans la GridView pour effectuer certaines actions de clic.

Faites: mettez une ImageView au lieu de ImageButton et gérez les événements de clic de ImageView.

78
Olgun Kaya

Si vous souhaitez utiliser Button ou ImageButton, vous devez écrire ces attributs dans votre code xml des widgets.

Android:focusable="false"
Android:focusableInTouchMode="false"

Cela fonctionne pour moi.

Mais dans GridView, essayez d'éviter l'utilisation de ces widgets. Vous pouvez utiliser n'importe quel autre widget à la place de celui-ci (comme ImageView ou tout autre). 

13
MPG

Assurez-vous également que votre ListAdpter renvoie true pour 

booléen public isEnabled (int _position)

pour la position que vous voulez cliquer.

3
r-hold

Essayez de définir 

    Android:clickable="false"
    Android:focusable="false"
1
newbie

Hey guyz a finalement trouvé une solution ...

ce que nous faisions est d'accéder directement à la mise en page à l'intérieur du GridView, de sorte que onItemClickListener trouve qu'il est compliqué d'accéder à l'élément.

La solution consiste donc à appliquer le onClickListener à l’intérieur de l’adaptateur (normalement, ArrayAdapter). 

donc, ce que j'essaie de dire, c'est:

public View getView(int position, View convertView, ViewGroup parent) {

            //Here row is a view and we can set OnClickListener on this
    final View row;
    ViewHolder holder = null;

    if (convertView == null) {
        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        //Here we inflate the layout to view (linear in my case)
        row = inflater.inflate(layoutResourceId, parent, false);
        holder = new ViewHolder();
        holder.imageTitle = (TextView) row.findViewById(R.id.text);
        holder.image = (ImageView) row.findViewById(R.id.image);
        row.setTag(holder);
    } else {
        row = convertView;
        holder = (ViewHolder) row.getTag();
    }

    ImageItem item = data.get(position);
    holder.imageTitle.setText(item.getTitle());
    holder.image.setImageBitmap(item.getImage());

    //Now get the id or whatever needed
    row.setId(position);
    // Now set the onClickListener
    row.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Toast.makeText(context, "Clicked" + row.getId() + "!!",
                    Toast.LENGTH_SHORT).show();
        }
    });
    return row;
}
1
Angesh K Chettiar

Je rencontre le même problème aussi, pour plusieurs raisons ... Voici donc mes conseils:

  1. Extend BaseAdapter pour votre adaptateur; 
  2. Utilisez OnClickListener dans l'adaptateur getView au lieu de régler OnItemClickListener pour GridView ;
  3. Évitez de définir LayoutParams plusieurs fois;
  4. Vérifiez si position = 0, n'utilisez pas convertView, gonflez un nouveau View ;
  5. Set OnClickListener pas seulement pour parent View , mais pour tout enfant View , le cas échéant; 
  6. Rendre tous vos Voir s cliquables.

Je viens de le tester sur 4 appareils et cette solution fonctionne comme prévu. J'espère que cela vous aidera dans votre cas… __. Corrigez-moi si je fais quelque chose de mal.

Code de mise en page XML:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="100dp"
    Android:layout_height="100dp"
    Android:background="#273238"
    Android:clickable="true"
    Android:focusable="true"
    Android:focusableInTouchMode="true"
    Android:padding="1dp">

<ImageView
    Android:id="@+id/open_image_item_imageview"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:src="@drawable/loh"
    Android:clickable="true"
    Android:focusable="false"
    Android:focusableInTouchMode="false"
    Android:scaleType="centerCrop"/>
<TextView
    Android:id="@+id/open_image_item_textview"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:clickable="true"
    Android:focusable="false"
    Android:focusableInTouchMode="false"
    Android:layout_gravity="bottom"
    Android:padding="4dp"
    Android:textSize="10sp"
    Android:ellipsize="start"
    Android:background="#55000000"
    Android:textColor="#FFFFFF"
    Android:text="image name"/>

</FrameLayout>

Code adaptateur Java:

 @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View view = null;
        if(convertView != null && position != 0)
            view = convertView;
        else{
            view = LayoutInflater.from(getContext()).inflate(R.layout.open_image_item_layout, null, false);
            view.setLayoutParams(new GridView.LayoutParams(GridView.AUTO_FIT, size));
        }

        TextView textView = (TextView)view.findViewById(R.id.open_image_item_textview);
        ImageView imageView = (ImageView)view.findViewById(R.id.open_image_item_imageview);

        ...

        View.OnClickListener onClickListener = getOnClickListener(files[position]);
        view.setOnClickListener(onClickListener);
        textView.setOnClickListener(onClickListener);
        imageView.setOnClickListener(onClickListener);

        return view;
    }
0
Dr. Failov