Est-il possible d'utiliser un OnItemClickListener sur un ListView lorsque la disposition des éléments a un widget cliquable/modifiable (RadioButton, EditText ou CheckBox)?
Vous voudrez peut-être jeter un oeil sur ce problème . Le fait d'avoir un élément qui peut être mis au point dans une rangée d'une ListView
entraîne l'invocation de OnItemClickListener
. Toutefois, cela ne signifie pas que vous ne pouvez pas avoir d’éléments activables/cliquables dans une rangée. Il existe certaines solutions de contournement telles que celle-ci .
Vous pouvez également consulter l'écran Journal des appels. Il a une ListView
avec élément cliquable (l'icône d'appel à droite) . Voir le code source ici
Citant le commentaire n ° 31 dans le lien mentionné par Samuh (qui a résolu le problème pour moi):
En fait, vous pouvez l'ajouter à la mise en page XML (si gonflée par une): Android: descendantFocusability = "blocksDescendants".
Ajout ici JIC cette page Web est en panne dans le futur.
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 param comme Android:descendantFocusability="blocksDescendants"
<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>
Essayé de nombreuses solutions complexes, mais ce fut la plus simple qui a fonctionné:
Il suffit d'utiliser Android:focusable="false"
comme dans:
<CheckBox
Android:id="@+id/fav_check_box"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:focusable="false" />
Deux meilleure solution
Android:descendantFocusability="beforeDescendants"
à listViewin xmlOUfalse
comme
Android:focusable="false"
Android:focusableInTouchMode="false"
Ensuite, il gérera les événements d'enfant d'élément de ligne listView (Button, EditText etc.) au lieu de listView.setOnItemClick.
J'ai corrigé mon problème différemment, dans mon article, j'ai plus d'un LinearLayout donc si vous donnez id à votre linearayout et setOnclickListener dans la classe adaptateur, cela fonctionnera, seul l'effet original du toucher disparaîtra . Mais ce lien Faire en sorte qu'un LinearLayout agisse comme un bouton est utile pour que linearlaout se comporte comme un bouton au clic
article
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:layout_marginTop="10dp">
<TextView
Android:id="@+id/txt_item_followers_name"
Android:layout_width="250dp"
Android:layout_height="wrap_content"
Android:layout_alignParentTop="true"
Android:gravity="center|start"
Android:paddingLeft="15dp"
Android:text="ALi"
Android:textAppearance="?android:attr/textAppearanceMedium" />
<ImageView
Android:id="@+id/imageView"
Android:layout_width="35dp"
Android:layout_height="35dp"
Android:layout_alignParentStart="true"
Android:layout_below="@+id/txt_item_followers_name"
Android:layout_marginLeft="10dp"
Android:src="@drawable/puan_icon" />
<TextView
Android:id="@+id/txt_item_followers_mark"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignBottom="@+id/imageView"
Android:layout_toEndOf="@+id/imageView"
Android:background="@color/red_400"
Android:paddingLeft="10dp"
Android:text="25.5"
Android:textAppearance="?android:attr/textAppearanceSmall" />
<LinearLayout
Android:id="@+id/linear_one"
Android:layout_width="match_parent"
Android:layout_height="60dp"
Android:layout_alignParentTop="true"
Android:layout_toEndOf="@+id/txt_item_followers_name"
Android:background="@color/red_400"
Android:orientation="vertical">
<ImageView
Android:id="@+id/btn_item_followers_2b_follow"
Android:layout_width="100dp"
Android:layout_height="match_parent"
Android:layout_alignParentEnd="true"
Android:layout_marginLeft="10dp"
Android:src="@drawable/follow_buton" />
</LinearLayout>
</RelativeLayout>
méthode getView à l'intérieur
@Override
public View getView(final int position, View convertView,
ViewGroup parent) {
View view = convertView;
if (convertView == null)
view = inflater.inflate(R.layout.deneme, null);
final Followers2 myObj = myList.get(position);
LinearLayout linear_one = (LinearLayout) view.findViewById(R.id.linear_one); // HERE WE DOMUNİCATE IT
linear_one.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(parentActivity, "One Two", Toast.LENGTH_SHORT).show();
}
});
TextView name = (TextView) view.findViewById(R.id.txt_item_followers_name);
TextView mark = (TextView) view.findViewById(R.id.txt_item_followers_mark);
final ImageView btn_follow = (ImageView) view.findViewById(R.id.btn_item_followers_2b_follow);
name.setText(myObj.getName());
mark.setText(myObj.getScore());
/* if (myObj.isFollow() == true) {
btn_follow.setImageResource(R.drawable.following_buton);
} else {
btn_follow.setImageResource(R.drawable.follow_buton);
}
btn_follow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Followers2 myObj = myList.get(position);
if (myObj.isFollow() == true) {
btn_follow.setImageResource(R.drawable.following_buton);
} else {
btn_follow.setImageResource(R.drawable.follow_buton);
}
}
});*/
return view;
}