45 votes

ListView OnItemClickListener ne répond pas ?

J'ai cherché partout une solution à ce problème, mais je n'arrive pas à trouver comment la mettre en œuvre. Mon site OnItemClickListener a été désactivé d'une manière ou d'une autre sur mon ListView rangs, parce que j'ai un ImageButton dans la mise en page de la ligne, qui prend le focus. J'ai trouvé de nombreuses questions, mais aucune ne m'a permis d'avancer.

J'ai vérifié ce question, mais je n'ai pas vraiment pu y répondre. J'ai juste besoin d'un moyen de rendre les rangées cliquables afin de pouvoir détecter quand une rangée est pressée. L'appui long et le focus fonctionnent bien.

60voto

jqpubliq Points 7677

Au lieu d'un OnItemClickListener , ajoutez un OnClickListener à chacune de vos vues retournées par votre adaptateur. Vous aurez besoin d'utiliser setItemsCanFocus la mise en place de votre liste :

ListView list = (ListView) findViewById(R.id.myList);
list.setAdapter(new DoubleClickAdapter(this));
list.setItemsCanFocus(true);

et ensuite dans votre Adaptateur 's getView cela donnera une ligne cliquable. Le bouton est supposé être dans le xml gonflé.

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = View.inflate(context, R.layout.cell, null);
    view.setClickable(true);
    view.setFocusable(true);
    view.setBackgroundResource(android.R.drawable.menuitem_background);
    view.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            new AlertDialog.Builder(context).setTitle("touched").show();
        }

    });
    return view;
}

47 votes

N'oubliez pas de recycler les vues ! Utilisez la convertView, ne gonflez pas une nouvelle vue à chaque fois.

0 votes

C'est ce que j'avais fait en gros, même si j'ai l'impression d'avoir eu des difficultés à faire quelque chose. Je vais réessayer, c'était peut-être juste une erreur stupide.

0 votes

Ok, est-ce que quelqu'un peut expliquer pourquoi les contrôles ListView ne fonctionnent pas comme prévu ? J'ai eu le même problème et cette solution fonctionne bien que le temps de réponse au toucher ne soit pas bon.

53voto

meizilp Points 2271

Définissez votre ImageButton L'attribut de l'enfant :

android:focusable="false"

Parce que AbsListView.onTouchEvent vérifier child.hasFocusable() .

4 votes

Fonctionne très bien pour les TextViews. Pas tellement pour les boutons.

0 votes

Si vous utilisez Android:inputType pour le textview, vous devez également le supprimer.

0 votes

Une bien meilleure option que la réponse avec le prix. Enregistrer un seul auditeur, et s'en occuper. Moins de mémoire pour démarrer.

10voto

user1681572 Points 946

J'ai testé la solution suivante sur les niveaux 8 et 16 du SDK.

En getView()

setFocusable(false);
setClickable(false);

plutôt que de les mettre à la valeur réelle dans les paramètres de l'adaptateur. getView() fait ce que je pense que la question originale voulait, et signifie qu'une OnItemClickListener est appelé, à condition qu'un OnClickListener n'est pas défini dans getView() .

Je suppose que tout ce qu'on peut faire dans une vue OnClickListener vous pouvez le faire tout aussi facilement dans un ListView 's OnItemClickListener . ( setOnClickListener sur une vue définit implicitement la vue comme étant cliquable, ce qui empêche l'utilisation de l'option ListView correspondant à OnItemClickListener être appelé, apparemment).

Le comportement est conforme à ce que l'on pourrait attendre, en termes de ImageButton L'état visuel de l'article lorsque celui-ci est pressé ou retourné.

La solution est une légère illusion, en ce sens que c'est l'élément de la liste qui est pressé et non le ImageButton Ainsi, si le bouton n'occupe pas tout l'élément de la liste, le fait de cliquer ailleurs dans l'élément fera en sorte que l'état du bouton reflète le clic. Même chose pour le focus. Cela pourrait être un prix à payer.

4 votes

Si votre rangée ListView comporte plusieurs éléments cliquables, vous pouvez probablement obtenir exactement ce que vous voulez en définissant les paramètres suivants android:descendantFocusability="blocksDescendants" sur la mise en page de l'élément de liste de niveau supérieur, et ne pas définir un OnClickListener sur la vue que vous retournez avec getView(). Définition de OnClickListener sur les éléments individuels fonctionneront toujours.

1 votes

Cette solution a également fonctionné pour moi. Dans mon cas, je ne recevais pas l'événement clicked dans le OnItemClickListener lorsque le RadioButton était cliqué.

0 votes

Je suis bloqué depuis 6 heures maintenant, et j'ai vraiment besoin d'aide. stackoverflow.com/questions/35108940/why-cant-i-remove-an-item/

5voto

humbleCoder Points 53

Une alternative à la fixation d'un OnClickListener pour chaque vue est de NE PAS utiliser une ImageButton - utiliser un ImageView à la place. Le site ImageView peut toujours envoyer des événements à une OnClickListener et ne prendra pas le dessus sur le centre d'intérêt.

5voto

silentkratos Points 266

La meilleure façon de faire est la suivante :

  android:focusable="false"
  android:focusableInTouchMode="false"

définir ces propriétés pour cela Imagebutton et essayer. I

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X