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" />
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 ImageButton
s. Selon référence officielle , blocksDescendants
signifie que ViewGroup
empêchera ses descendants de recevoir le focus.
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é.
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 .
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);
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;
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;
}
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.