web-dev-qa-db-fra.com

ListView avec un widget cliquable/éditable

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)? 

44
bugzy

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

68
Samuh

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.

20
khalid13

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>
11
Bhavesh Hirpara

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" />
3
Henrique de Sousa

Deux meilleure solution 

  1. Ajouter Android:descendantFocusability="beforeDescendants" à listViewin xmlOU
  2. Définissez deux attributs sur false

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.

0
Xar E Ahmer

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;
    }
0
Sam