web-dev-qa-db-fra.com

OnItemCLickListener ne fonctionne pas dans une liste

Activity code de classe:

conversationList = (ListView)findViewById(Android.R.id.list);
ConversationArrayAdapter conversationArrayAdapter=new  ConversationArrayAdapter(this, R.layout.conversation_list_item_format_left, conversationDetails);
conversationList.setAdapter(conversationArrayAdapter);
conversationList.setOnItemClickListener(new AdapterView.OnItemClickListener(){ 
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
        Log.d("test","clicked");
    }
});

La fonction getView dans la classe Adapter:

if (v == null) {                                
    LayoutInflater vi = (LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    if(leftSideMessageNumber.equals(m.getTo())) {
        v = vi.inflate(R.layout.conversation_list_item_format_left, null);
    } else {
        v = vi.inflate(R.layout.conversation_list_item_format_right, null);
    }
}

Y at-il un problème avec l'utilisation de deux XML en gonflant?

225
hiei

Je viens de trouver une solution d'ici .. mais en cliquant profondément ...

Si un élément de ligne de la liste contient une vue activable ou cliquable, OnItemClickListener ne fonctionnera pas.

L'élément de ligne doit avoir un paramètre comme Android:descendantFocusability="blocksDescendants".

ici, vous pouvez voir un exemple de la manière dont votre élément de liste devrait ressembler à . Votre élément de liste xml devrait être ...

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:baselineAligned="false"
Android:descendantFocusability="blocksDescendants"
Android:gravity="center_vertical" >

// your other widgets here

</LinearLayout>
702
Bhavesh Hirpara

Le problème est que vos mises en page contiennent des éléments pouvant être mis au point ou pouvant être cliqués . Si une vue contient des éléments pouvant être mis au point ou pouvant être cliqués, OnItemCLickListener ne sera pas appelé.

Cliquez ici pour plus d'informations.

S'il vous plaît postez un de vos XML XML de mise en page si ce n'est pas le cas.

87
balazsbalazs

Pour mes listes, mes lignes comportent d'autres éléments sur lesquels il est possible de cliquer, tels que des boutons, de sorte que la création d'un bloc blocksDescendants ne fonctionne pas. Au lieu de cela, j'ajoute une ligne dans le fichier XML du bouton:

    Android:focusable="false"

Cela empêche les boutons de bloquer les clics sur les lignes, mais permet également aux boutons de prendre les clics également.

56
Janene Pappas

vous devez effectuer 2 étapes dans votre listview_item.xml

  1. définir la mise en page racine avec: Android:descendantFocusability="blocksDescendants"
  2. définissez toute vue pouvant être mise au point ou cliquée dans cet élément avec
    Android:clickable="false" 
    Android:focusable="false"
    Android:focusableInTouchMode="false"

Voici un exemple: listview_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:layout_marginBottom="10dp"
    Android:layout_marginTop="10dp"
    Android:paddingLeft="10dp"
    Android:paddingRight="10dp"
    Android:gravity="center_vertical"
    Android:orientation="vertical"
    Android:descendantFocusability="blocksDescendants">

    <RadioButton
        Android:id="@+id/script_name_radio_btn"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:textStyle="bold"
        Android:textColor="#000"
        Android:padding="5dp"
        Android:clickable="false"
        Android:focusable="false"
        Android:focusableInTouchMode="false"
        />

</LinearLayout>
29
Eddy

utiliser le code ci-dessous à l'intérieur de la balise button dans la disposition de ligne personnalisée de listview

 Android:focusable="false"
 Android:clickable="false"
18
Milan Shukla

Utilisez Android: descendantFocusability

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="80dip"
    Android:background="@color/light_green"
    Android:descendantFocusability="blocksDescendants" >

Ajouter ci-dessus dans la disposition racine

17
Amar Gore

J'ai eu le même problème et je viens de voir que j'avais accidentellement réglé:

@Override
public boolean isEnabled(int position)
{
    return false;
}

sur ma classe CustomListViewAdapter.

En remplaçant ceci par:

return true;

J'ai réussi à résoudre le problème ... juste au cas où quelqu'un aurait fait la même erreur ...

16
Woody

Je l'ai résolu avec l'aide de cette réponse

1.Ajouter les éléments suivants dans la disposition linéaire de list_items.xml Android:descendantFocusability="blocksDescendants" 

2. Vues d'enfants de LinearLayout dans list_items.xml

 Android:focusable="false" 
11
RAJESH KUMAR ARUMUGAM

Même si j’avais le même problème, j’ai une case à cocher, a fait ce qui suit pour masquer le travail d’articleClickListener,

Ajout des propriétés suivantes à la case à cocher,

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

et ItemClickListner a commencé à fonctionner.

Pour un exemple détaillé, vous pouvez passer par le lien,

http://knowledge-cess.com/Android-itemclicklistner-with-checkbox-or-radiobutton/

J'espère que ça aide Cheers !!

10
Gokul Kulkarni

si vous avez des vues de texte, des boutons ou des informations cliquables ou sélectionnables dans votre affichage de lignes uniquement

Android:descendantFocusability="blocksDescendants"

n'est pas assez. Vous devez définir 

Android:textIsSelectable="false"

à vos textviews et 

Android:focusable="false"

à vos boutons et autres éléments de mise au point.

10
savepopulation

J'ai eu le même problème et j'ai essayé toutes les solutions mentionnées en vain. après des tests, j’ai trouvé que rendre le texte sélectionnable empêchait l’auditeur d’être appelé. Donc, en le commutant sur false ou en le supprimant, mon auditeur a été appelé à nouveau. 

Android:textIsSelectable="false"

espérons que cela aide quelqu'un qui a été coincé comme moi.

5
u2tall

Cela présentait deux solutions géniales: si votre extension ListFragment à partir d'un fragment, sachez que mListView.setOnItemClickListener ne sera pas appelée avant la création de votre activité, cela est garanti lorsque cette activité est définie

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    mListView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int position, long rowId) {
            // Do the onItemClick action

            Log.d("ROWSELECT", "" + rowId);
        }
    });
}

En regardant le code source de ListFragment, je suis tombé sur cette

public class ListFragment extends Fragment {
    ...........................................
    ................................................

    final private AdapterView.OnItemClickListener mOnClickListener
                = new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
            onListItemClick((ListView)parent, v, position, id);
        }
    };

    ................................................................
    ................................................................

    public void onListItemClick(ListView l, View v, int position, long id) {
    }
}

Un objet onItemClickListener est attaché et appelle onListItemClick() En tant que telle, l’autre solution similaire, qui fonctionne exactement de la même manière, consiste à remplacer onListItemClick().

@Override
public void onListItemClick(ListView l, View v, int position, long rowId) {
    super.onListItemClick(l, v, position, id);
   // Do the onItemClick action

   Log.d("ROWSELECT", "" + rowId);
} 
3
Rowland Mtetezi

dans mon cas, aucune des propriétés de mise en page XML n'était utile.

Je viens d'ajouter une seule ligne de code comme ceci: convertView.setClickable (false);

@NonNull
@Override
public View getView(final int position, View convertView, @NonNull ViewGroup parent) {
    ViewHolder viewHolder;
    if (convertView == null || convertView.getTag() == null) {
        LayoutInflater inflater = LayoutInflater.from(context);
        convertView = inflater.inflate(R.layout.my_layout_id, parent, false);
        viewHolder = new ViewHolder(convertView);
        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }
    ...
    convertView.setClickable(false);
    return convertView;
}

donc, fondamentalement, il fait la même chose que la configuration des propriétés dans la mise en page XML, mais c'est seulement la chose qui fonctionne dans mon cas.

Ce n'est pas un timing parfait, mais peut-être que cela aidera quelqu'un Bon codage

2
Marek Skóra
  1. Ajouter ceci dans la disposition principale 

    Android:descendantFocusability="blocksDescendants"
    
  2. Écrivez ce code dans chaque bouton, Textview, ImageView, etc. qui ont OnClick 

    Android:focusable="false"
    
    Android:clickable="false"
    

J'espère que ça va marcher.

2
Wajid khan

J'ai eu le même problème, j'utilisais un style pour mes textes dans la disposition des lignes qui avait l'attribut "focusable". Cela a fonctionné après que je l'ai enlevé.

1
Miguel Rdz

J'ai essayé tout ce qui précède et RIEN n'a fonctionné.

J'ai résolu le problème comme suit:

Tout d'abord, je définis un bouton personnalisé appelé ListButton

public class ListButton extends Android.widget.Button
{

private ButtonClickedListener clickListener;

public ListButton(Context context)
{
    this(context, null);
}

public ListButton(Context context, AttributeSet attrs)
{
    this(context, attrs, 0);
}

public ListButton(Context context, AttributeSet attrs, int defStyle)
{
    super(context, attrs, defStyle);
}

public void setClickListener(ButtonClickedListener listener) {
    this.clickListener = listener;
}

@Override
public boolean isInTouchMode() {
    return true;
}

@Override
public boolean onTouchEvent(MotionEvent event) {

    return false;
}

@Override
public boolean dispatchTouchEvent(MotionEvent event) {

    switch (event.getAction()) 
      {
          case MotionEvent.ACTION_DOWN:
              break;
          case MotionEvent.ACTION_UP:

              eventClicked();

              break;
          case MotionEvent.ACTION_CANCEL:
              break;
          case MotionEvent.ACTION_MOVE:
              break;
          default :

      }
    return true;
}

private void eventClicked() {
    if (this.clickListener!=null) {
        this.clickListener.ButtonClicked();
    }
}

}

Le XML ressemble à:

<dk.example.views.ListButton
Android:id="@+id/cancel_button"
Android:layout_width="125dp"
Android:layout_height="80dp"
Android:text="Cancel"
Android:textSize="20sp" 
Android:layout_margin="10dp"
Android:padding="2dp"
Android:background="#000000"
Android:textColor="#ffffff"
Android:textStyle="bold"  
/>

Ensuite, je définis ma propre interface ButtonClicked Listener:

public interface ButtonClickedListener {
    public void ButtonClicked();
}

Ensuite, j'utilise mon propre auditeur comme s'il s'agissait de la variable normale OnClickListener:

final ListButton cancelButton = (ListButton) viewLayout.findViewById(R.id.cancel_button);

    cancelButton.setClickListener(new ButtonClickedListener() {

        @Override
        public void ButtonClicked() {
            //Do your own stuff here...
        }

    });
1
AndreasReiff

Android: l'attribut autoText rend également TextView autofocus.

Face au même problème, essayé pendant des heures. Si vous avez essayé toutes les solutions ci-dessus, essayez de modifier layout_width de Listview et l'élément de liste en match_parent à partir de wrap_content.

0
prashant
private AdapterView.OnItemClickListener onItemClickListener;

@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
 .......

final View view = convertView;
convertView.setOnClickListener(new View.OnClickListener() {
    @Override
     public void onClick(View v) {
         if (onItemClickListener != null) {
             onItemClickListener.onItemClick(null, view, position, -1);
         }
      }
 });

return convertView;
}

public void setOnItemClickListener(AdapterView.OnItemClickListener onItemClickListener) {
    this.onItemClickListener = onItemClickListener;
}

Ensuite, dans votre activité, utilisez adapter.setOnItemClickListener () avant de l'attacher à la vue liste.

Copié de github sa a fonctionné pour moi

0
Java coder

Ce qui a fonctionné pour moi a été d'ajouter le code ci-dessous à chaque sous-vue de la présentation de mon fichier row.xml

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

Donc dans mon cas:

<?xml version="1.0" encoding="utf-8"?>
<Android.support.constraint.ConstraintLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">


    <TextView
        Android:focusable="false"
        Android:focusableInTouchMode="false"
        Android:id="@+id/testingId"
        Android:text="Name"
       //other stuff 
        />

    <TextView
        Android:focusable="false"
        Android:focusableInTouchMode="false"
        Android:id="@+id/dummyId"
        Android:text="icon"
        //other stuff 
        />

    <TextView
        Android:focusable="false"
        Android:focusableInTouchMode="false"
        Android:id="@+id/assignmentColor"
       //other stuff 
       />

    <TextView
        Android:focusable="false"
        Android:focusableInTouchMode="false"
        Android:id="@+id/testID"
        //other stuff 
        />

    <TextView
        Android:focusable="false"
        Android:focusableInTouchMode="false"
        Android:text="TextView"
        //other stuff 
        />

</Android.support.constraint.ConstraintLayout>

Et voici mon appel setOnItemClickListener dans ma sous-classe Fragment:

CustomListView = (PullToRefreshListCustomView) layout.findViewById(getListResourceID());
        CustomListView.setAdapter(customAdapter);
        CustomListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Log.d("Testing", "onitem click working");
              //  other code
            }

        });

J'ai eu la réponse de ici !

0
spcarlin

Si vous souhaitez utiliser à la fois le clic simple et le clic long sur les éléments de la liste, le meilleur moyen de le mettre en œuvre serait d'utiliser le menu contextuel pour un clic long. Évitez d’utiliser setItemLongClickListener, en particulier si vous avez plusieurs dispositions de lignes pour votre vue de liste. 

0
Samuel Robert

Tout ce qui précède a échoué pour moi. Cependant, j'ai pu résoudre le problème (après plusieurs heures passées à me cogner la tête - Google, si vous écoutez, essayez de réparer ce que j'ai rencontré ci-dessous sous la forme d'erreurs de compilation, si possible).

Vous devez vraiment faire attention aux attributs Android que vous ajoutez à votre présentation xml ici (dans cette question originale, cela s'appelle list_items.xml). Pour moi, ce qui posait problème, c’est que j’étais passé d’une vue EditText à une vue TextView et que j’avais perdu les attributs dus au changement (dans mon cas, inputType). Le compilateur ne l'a pas compris et la cliquabilité a tout simplement échoué lorsque je suis allé exécuter l'application. Vérifiez tous les attributs que vous avez dans vos nœuds XML de mise en page.

0
Ted_Zactly