web-dev-qa-db-fra.com

ne peut pas cliquer sur la ligne listview avec imagebutton

J'ai des problèmes avec listview. ses éléments (lignes) ont imagebutton . imagebutton a "Android: onClick", donc cet événement onclick fonctionne, mais cliquez sur la ligne ne fonctionne pas. si je supprime imagebutton de la ligne item, cliquez sur la ligne fonctionne (listview a le listner correct onclick). Comment puis-je le réparer? J'ai besoin d'un événement onclick lorsque l'utilisateur clique sur imagebutton et d'un événement clic standard, lorsque l'utilisateur sélectionne une ligne (ne cliquez pas sur le bouton image, mais cliquez sur la ligne)

ma listview:

<ListView xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:id="@+id/restaurants_list"
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent"
        Android:divider="@color/list_devider"
        Android:dividerHeight="1dp"
        Android:cacheColorHint="@color/list_background" /> 
54
yital9

Malheureusement,

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

ne fonctionne pas pour ImageButton.

J'ai finalement trouvé la solution ici . Dans votre mise en page XML pour ces éléments, ajoutez 

Android:descendantFocusability="blocksDescendants" 

à la vue racine.

Cela fonctionne parfaitement pour un ListView qui a ImageButtons. Selon référence officielle , blocksDescendants signifie que ViewGroup empêchera ses descendants de recevoir le focus.

177
Eliko

Vous pouvez utiliser un adaptateur personnalisé pour votre listView (si vous ne l'avez pas déjà fait). Et là, dans la méthode getView(int position, View inView, ViewGroup parent) de l'adaptateur, procédez comme suit:

@Override
public View getView(int position, View inView, ViewGroup parent) {

    View v = inView;
    ViewHolder viewHolder; //Use a viewholder for sufficent use of the listview

    if (v == null) {
        LayoutInflater inflater = (LayoutInflater) adaptersContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = inflater.inflate(R.layout.list_item, null);
        viewHolder = new ViewHolder();
        viewHolder.image = (ImageView) v.findViewById(R.id.ImageView);
        v.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) v.getTag();
    }

        .....

    viewHolder.image.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            //Click on imageView
        }i
    });

    v.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            //Click on listView row
        }
    });

        .....

    return (v);
}

Voir ici si vous avez besoin d’aide pour créer votre adaptateur personnalisé.

7
Angelo

Si une ligne de listView contient un élément cliquable tel que Button, Image .. etc., alors onItemClick ne fonctionnera pas. Vous devez donc écrire l'écouteur de clics dans getView de votre adaptateur de liste.

Pour plus de lecture ceci .

6
Mohsin Naeem

Définissez ces propriétés pour votre bouton:

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

Ou vous pouvez le définir dynamiquement dans votre classe d'adaptateur:

        yourButton.setFocusable(false);
    yourButton.setFocusableInTouchMode(false);

Et assurez-vous de définir le mode de choix sur Single pour la listview:

       listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
2
Yogesh Somani

Dans mon cas, Android:descendantFocusability="blocksDescendants" pour la couche principale ne fonctionnait pas, ni dans ListView. J'ai aussi essayé Android:focusable="false" Android:focusableInTouchMode="false" qui m'a dit que cela fonctionnait pour les boutons, mais j'avais ImageButton, alors ce n'était pas le cas. 

Mais définir les propriétés du bouton dans le fichier CS de la mise en forme a fonctionné.

var imageButton = view.FindViewById<ImageButton>(Resource.Id.imageButton1);
imageButton.Focusable = false;
imageButton.FocusableInTouchMode = false;
imageButton.Clickable = true;
2
Giurgiu Ovidiu

Si une ligne contient plusieurs éléments cliquables, onItemClick () ne fonctionnera pas. Vous devrez définir OnClickListener dans la méthode getView(). Stockez les écouteurs dans la balise de la vue afin qu'ils puissent être recyclés, ajoutez des méthodes à vos écouteurs afin qu'ils puissent être spécialisés pour différentes lignes.

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
        View view = super.getView(position, convertView, parent);

        RowClickListeners listeners = (RowClickListeners) view.getTag();
        if (listeners == null) {
            listeners = new RowClickListeners();
        }

        // Row click listener:
        RowClickListener onClickListener = listeners.rowClickListener;
        if (onClickListener == null) {
            onClickListener = new RowClickListener();
            listeners.rowClickListener = onClickListener;
        }
                    onClickListener.setToPosition(pos);
        view.setOnClickListener(onClickListener);

        // Overflow listener:
        View btn = view.findViewById(R.id.ic_row_btn);
        ButtonListener btnListener = listeners.buttonClickListener;
        if (rowListener == null) {
            btnListener = new ButtonListener(activity);
            listeners.rowClickListener = btnListener;
        }
                    btnListener.setToPosition(pos);
        btnListener.setCollection(collectionId);
        btn.setOnClickListener(btnListener);
    }


    public static class RowClickListeners {
        public RowClickListener rowClickListener;
        public ButtonListener buttonClickListener;
    }
1
Maarten

aucune réponse ci-dessus n'a fonctionné pour moi, mais une combinaison a fait.

Je définis maintenant Android:descendantFocusability="blocksDescendants" sur ListView et Android:focusable="false" Android:focusableInTouchMode="false" sur ImageButtons dans XMLETen Java. J'ai également défini descendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS) sur ListView et focusable(false), focusableInTouchMode(false), clickable(true) sur ImageButtons.

0
SteelBytes