web-dev-qa-db-fra.com

OnItemClickListener et OnClickListener ne fonctionnent pas pour ListView

J'ai utilisé un ListView personnalisé et j'affiche des données en utilisant le même ListView. 

Lorsque je clique sur l'élément de liste, le onClickListener n'est pas appelé. Je ne peux sélectionner aucun élément de la liste.

Code de mise en page:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:layout_alignParentBottom="true"
Android:layout_alignParentLeft="true"
Android:layout_marginBottom="16dp"
Android:background="@drawable/list_selector"
Android:clickable="true"
Android:orientation="horizontal"
Android:padding="5dip" >

<LinearLayout
    Android:id="@+id/imgProperty"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_alignParentLeft="true"
    Android:layout_marginRight="5dip"
    Android:padding="3dip" >

    <ImageView
        Android:id="@+id/list_image"
        Android:layout_width="50dp"
        Android:layout_height="50dp"
        Android:contentDescription="@string/app_name"
        Android:src="@drawable/ic_launcher" 
        Android:focusable="false"/>
</LinearLayout>

<TextView
    Android:id="@+id/tvCity"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_centerVertical="true"
    Android:layout_marginLeft="75dip"
    Android:layout_toRightOf="@+id/list_image"
    Android:paddingBottom="10dip"
    Android:text="property"
    Android:textColor="#040404"
    Android:textSize="15sp"
    Android:textStyle="bold"
    Android:typeface="sans" />

<TextView
    Android:id="@+id/tvprice"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_alignBottom="@+id/imgProperty"
    Android:layout_alignLeft="@+id/tvCity"
    Android:text="Price" 
    Android:focusable="false"/>

</RelativeLayout>

Code de l'adaptateur:

 public class CustomListAdapter extends BaseAdapter {

 ArrayList<Propety> PropertiesArray;
private LayoutInflater Inflater;


public CustomListAdapter(ArrayList<Propety> PropertiesArray) {  

   this.PropertiesArray=PropertiesArray;

}
@Override
public int getCount() {
    // TODO Auto-generated method stub
    return PropertiesArray.size();
}

@Override
public Object getItem(int position) {

    return PropertiesArray.get(position);
}

@Override
public long getItemId(int position) {

    return position;
}

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

     if (convertView == null) {
            LayoutInflater inflater = LayoutInflater.from(parent.getContext());
            convertView = inflater.inflate(R.layout.customlistview, parent, false);
        }


        final Propety ListArray = PropertiesArray.get(position);

       TextView tvPropertyName = (TextView) convertView.findViewById(R.id.tvCity);
       tvPropertyName.setText(ListArray.getName());

        TextView tvPrice = (TextView) convertView.findViewById(R.id.tvprice);
        tvPrice.setText(ListArray.getPrice());

       ImageView imgProperty = (ImageView) convertView.findViewById(R.id.list_image);
       imgProperty.setImageResource(R.drawable.ic_launcher);


       convertView.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

             Toast.makeText(parent.getContext(), "view clicked: " + ListArray.getName(), Toast.LENGTH_SHORT).show();
        }
    });


    return convertView;
}

}

Code ListView:

 ListView propertylistview = (ListView) findViewById(R.id.listview);
CustomListAdapter customlistview=new CustomListAdapter(PropertiesArray);
propertylistview.setAdapter(customlistview);

ListView XML:

 <ListView
    Android:id="@+id/listview"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:layout_alignParentLeft="true"
    Android:layout_below="@+id/customview"
    Android:layout_marginBottom="10dp"
    Android:layout_marginLeft="10dp"
    Android:layout_marginRight="10dp"
    Android:layout_marginTop="24dp"
    Android:background="@drawable/list_selector"
    Android:textAlignment="center" >

custom.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content" >

<SurfaceView
    Android:id="@+id/surface"
    Android:layout_width="fill_parent"
    Android:layout_height="match_parent" />

<TextView
    Android:id="@+id/txtangle"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_alignParentBottom="true"
    Android:layout_alignParentLeft="true"
    Android:layout_marginBottom="115dp"
    Android:layout_marginLeft="95dp"
    Android:text="" />

<ListView
    Android:id="@+id/listview"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:layout_alignParentLeft="true"
    Android:layout_below="@+id/customview"
    Android:layout_marginBottom="10dp"
    Android:layout_marginLeft="10dp"
    Android:layout_marginRight="10dp"
    Android:layout_marginTop="24dp"
    Android:background="@drawable/list_selector"
    Android:textAlignment="center" >

</ListView>

<view
    Android:id="@+id/customview"
    Android:layout_width="110dp"
    Android:layout_height="110dp"
    Android:layout_alignParentLeft="true"
    Android:layout_alignParentTop="true"
    class="com.example.samplebuapp.CustomCompass" />

<view
    Android:id="@+id/view1"
    Android:layout_width="110dp"
    Android:layout_height="110dp"
    Android:layout_above="@+id/listview"
    Android:layout_alignParentRight="true"
    Android:layout_marginRight="18dp"
    class="com.example.samplebuapp.CustomView" />

<LinearLayout
    Android:id="@+id/rl1"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:layout_alignParentLeft="true"
    Android:layout_below="@+id/listview"
    Android:orientation="vertical" 
    Android:focusable="false">
</LinearLayout>

</RelativeLayout>

Même le défilement ne fonctionne pas.

Je suis incapable de comprendre pourquoi cela se produit-il? Est-ce que je manque quelque chose? 

Toute aide pour résoudre ceci est appréciée.

12
Mahe

Ce qui suit fera le travail dans votre cas.

ListView propertylistview = (ListView) findViewById(R.id.listview); 
    propertylistview.setOnItemClickListener(  myListViewClicked ):

        OnItemClickListener myListViewClicked = new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(YourActivity.this, "Clicked at positon = " + position, Toast.LENGTH_SHORT).show();

            }
        };

N'oubliez pas de supprimer les éléments suivants du CustomAdapter

  convertView.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {

         Toast.makeText(parent.getContext(), "view clicked: " + ListArray.getName(), Toast.LENGTH_SHORT).show();
    }
});
10
Lazy Ninja

Je suis d'accord avec Ninjia mais vous devez ajouter ceci au code XML: Vous devez définir sur tous les objets enfants de la liste itemview (TextView, ImageView etc.):

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

Et pour l'élément racine RelativeLayout/LinearLayout et ainsi, définissez:

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

Si vous ne les définissez pas, ils "attraperont" l'événement de clic. Et si vous avez un adaptateur listView personnalisé, vérifiez simplement que vous substituez:

@Override
public boolean isEnabled(int position)
{
return true;
}
54
Domenico Pacecca

Vérifiez votre disposition de ligne de liste une fois: 

la mise en page ou une vue ne doit pas être `Android: clickable =" true "et Android: focusable = "true"

si c'est le cas, supprimez et exécutez à nouveau l'application.

2
Surendar D

le code simple qui a résolu mon problème et la méthode view.setOnClickListener se trouvent dans mon adaptateur personnalisé 

    view.setFocusable(false)
2
Jhonatas

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 !!

1
Gokul Kulkarni

Pour TextView, vous devez également utiliser 

Android:textIsSelectable="false"

https://developer.Android.com/reference/Android/widget/TextView.html#setTextIsSelectable

1
Karats Mohanraj