web-dev-qa-db-fra.com

ListView OnItemClickListener ne répond pas?

J'ai cherché partout une solution à ce problème, mais je ne vois pas comment le mettre en œuvre. Ma OnItemClickListener a été désactivée d'une manière ou d'une autre sur mes lignes ListView, car j'ai une ImageButton dans la disposition des lignes, qui prend le focus. J'ai trouvé de nombreuses questions, mais aucune ne m'a conduit nulle part.

J'ai vérifié cette question, mais je ne pouvais pas vraiment en faire la tête ou la queue. J'ai juste besoin d'un moyen de rendre les lignes cliquables afin de pouvoir détecter le moment où une ligne est appuyée. Appuyez longuement et concentrez-vous bien.

44
Kleptine

Au lieu d'un OnItemClickListener, ajoutez un OnClickListener à chacune de vos vues renvoyées par votre adaptateur. Vous devrez utiliser setItemsCanFocus pour configurer votre liste:

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

puis dans getView de votre Adaptateur, vous obtiendrez une ligne cliquable. Le bouton est supposé être dans le fichier 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;
}
60
jqpubliq

définir l'attribut de votre ImageButton:

Android:focusable="false"

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

51
meizilp

Cela fonctionnera certainement. Ajoutez ceci à la définition de la mise en page.

Android:descendantFocusability="blocksDescendants" 

Trouvé la solution ici

6
Kapil Raju

la meilleure façon de faire est la suivante:

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

définissez ces propriétés pour cette Imagebutton et essayez . I 

5
silentkratos

Une alternative à la définition d'une OnClickListener pour chaque vue est de NE PAS utiliser une ImageButton - utilisez plutôt une ImageView. La ImageView peut toujours envoyer des événements à une OnClickListener et ne prendra pas le focus.

5
humbleCoder

Pour ma version de ce problème, le problème était que j'avais défini mon objet TextView sur Android:inputType="textMultiLine". Lorsque j'ai supprimé cette ligne, le problème de la liste non cliquable avait disparu. On dirait un méchant petit insecte.

De plus, je suis toujours capable d'utiliser les propriétés Android:minLines/Android:maxLines sans problème, donc ce n'est pas un gros problème. Ce n'est tout simplement pas la solution à laquelle je m'attendais.

4
greg7gkb

En tant que solution alternative qui fonctionne pour moi, vous pouvez essayer d'étendre votre adaptateur de BaseAdapter (iso implémentant l'interface ListAdapter)

1
Pavel Dudka

La ligne suivante a résolu le problème dans mon projet:

<TextView ... Android:textIsSelectable="false" />
1
hogi

J'ai sous-classé ImageButton et setFocusable="false" dans la définition de la présentation ne fonctionnait pas pour moi. Il a résolu l'appel de setFocusable(false) dans le constructeur de la sous-classe.

0
Lukas Novak

Mettez ce code ImageView nextpage= (ImageView)findViewById(R.id.btnEdit); au lieu de ImageButton. maintenant l'élément de la liste est actif 

0
newb
    listView= (ListView) findViewById(R.id.listview_names);

   listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
       @Override
       public void onItemClick(AdapterView<?> parent, View view, int position, long id)
       {
           Toast.makeText(getBaseContext(),"Clicked Button",Toast.LENGTH_LONG).show();
           Log.d("h","clicked");

           /* Intent intent=new Intent(MainActivity.this,Display_data.class);

            intent.putExtra("NAME",n);
            intent.putExtra("AGE",a);
            startActivity(intent);*/
       }
   });

Y ce toast ne fonctionne pas

0
Jay