Les éléments ListView ne sont pas cliquables. pourquoi?

j'ai un ListView qui utilise un adaptateur personnalisé, mais je ne peux pas cliquer sur L'Item ListView ..

l'Activité pour l'affichage de la liste ..

package com.adhamenaya.projects;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.adhamenaya.classes.Place;

public class PlacesListActivity extends Activity {
    private ArrayList<Place> places;
    private ArrayList<String> items;
    GridviewAdapter mAdapter;
    private ListView lvPlaces;
    private EfficientAdapter adap;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.places_list);
        lvPlaces = (ListView) this.findViewById(R.id.lvPlaces);
        new DowanloadPlaces().execute("");
    }
    private void bindList(ArrayList<Place> places) {
        this.places = places;
        // Start creating the list view to show articles
        items = new ArrayList<String>();
        for (int i = 0; i < places.size(); i++) {
            items.add(String.valueOf(places.get(i).mName));
        }
        adap = new EfficientAdapter(this);
        adap.notifyDataSetChanged();
        lvPlaces.setAdapter(adap);
    }

    // EfficientAdapter : to make a customized list view item
    public class EfficientAdapter extends BaseAdapter implements Filterable {

        // The function of inflater to convert objects from XML layout file (i.e. main.xml) to a programmable 
        LayoutInflater inflater;
        Context context;

        public EfficientAdapter(Context context) {
            inflater = LayoutInflater.from(context);
            this.context = context;
        }

        public int getCount() {
            // Get the number of items in the list
            return items.size();
        }

        public Object getItem(int position) {
            // To return item from a list in the given position 
            return items.get(position);
        }

        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return 0;
        }

        public View getView(final int position, View convertView,ViewGroup parent) {
            ViewHolder holder;
            if (convertView == null) {
                convertView = inflater.inflate(R.layout.adaptor_content, null);

                holder = new ViewHolder();// Create an object to hold at components in the list view item
                holder.textLine = (TextView) convertView.findViewById(R.id.textLine);
                holder.buttonLine = (Button) convertView.findViewById(R.id.buttonLine);
                holder.buttonLine.setOnClickListener(new OnClickListener() {
                    private int pos = position;

                    public void onClick(View v) {
                        places.remove(pos);
                        bindList(places);// to bind list items
                        Toast.makeText(getApplicationContext(),"Deleted successfuly :)", Toast.LENGTH_LONG).show();
                    }
                });
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
            // Bind the data efficiently with the holder.
            holder.textLine.setText(String.valueOf(places.get(position).mName));
            return convertView;
        }

        public Filter getFilter() {
            // TODO Auto-generated method stub
            return null;
        }

    }

    // ViewHolder : class that represents a list view items
    static class ViewHolder {
        TextView textLine;
        Button buttonLine;
    }

    // DownloadRSSFeedsTask: works in a separate thread
    private class DowanloadPlaces extends AsyncTask<String, Void, ArrayList<Place>> {

        @Override
        protected ArrayList<Place> doInBackground(String... params) {
            ArrayList<Place> places = new ArrayList<Place>();
            Place p = new Place();
            for(int i =0;i<25;i++){
                p.mName = "Al Mathaf Hotel";
                places.add(p);              
            }

            return places;
        }

        @Override
        protected void onPostExecute(ArrayList<Place> places) {
            bindList(places);


        }

    }


}

places_list.xml mise en page

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <ListView 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content"
        android:id="@+id/lvPlaces">

    </ListView>
</LinearLayout>

adaptor_content.xml mise en page

<ImageView
    android:id="@+id/imageView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/textLine"
    android:layout_centerVertical="true"
    android:src="@drawable/settings" />

</RelativeLayout>
27
demandé sur Rotemmiz 2012-01-21 21:59:42

11 réponses

essayez ceci pour obtenir le focus: Vue.getFocus ();

2
répondu niklas 2012-01-21 18:15:02

Android ne permet pas de sélectionner des éléments de liste qui ont des éléments focalisables (boutons). Modifier l'attribut xml du bouton à:

android:focusable="false"

il devrait toujours être cliquable, juste ne va pas gagner la mise au point...

136
répondu Rotemmiz 2012-01-21 18:20:04

j'ai eu le même problème avec une liste qui contient seulement un RadioButton:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >

<RadioButton
    android:id="@+id/userNameRadioButton"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

</LinearLayout>

j'ai utilisé le bouton RadioButton dans chaque rangée pour afficher la sélection d'item par défaut, pour faire des clics de manier ListView que j'ai dû utiliser:

radioButton.setFocusableInTouchMode(false);
radioButton.setFocusable(false);

ou dans le fichier XML:

android:focusable="false" 
android:focusableInTouchMode="false"

il s'agit donc d'une question liée au point de mire... Avec les modificateurs ci-dessus, le focus est dirigé vers ListView sur le clic.

25
répondu c0de 2013-05-21 09:13:01

Cette réponse ici a fonctionné pour moi: https://stackoverflow.com/a/16536355/5112161

Il a principalement ajouté dans le LinearLayout ou Relativementout ce qui suit:

android:descendantFocusability="blocksDescendants"

vous devez aussi supprimer de tout votre xml ce qui suit:

android:focusable="false"
android:focusable="true"
android:clickable="true"
android:clickable="false"
12
répondu fpr0001 2017-05-23 12:02:14

envisagez de rendre la valeur texte sélectionnable en spécifiant android: textIsSelectable= "true"

N'écoutez pas Google. Dans la disposition des lignes, définissez

textIsSelectable="false"

Merci Lint (not!)

3
répondu Henrique de Sousa 2013-05-30 09:13:55

je voulais ajouter un commentaire à rupps réponse, mais je n'ai pas assez de réputation.

si vous utilisez un adaptateur personnalisé prolongeant L'Adaptateur Array, vous pouvez écraser avec areAllItemsEnabled () et isEnabled(en position int) dans votre classe:

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

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

ce qui précède a corrigé ma vue de liste non cliquable. Peut-être ce commentaire aide aussi d'autres comme "liste android non cliquable" terme de recherche est assez élevé dans Google.

3
répondu John Sirach 2014-07-14 08:51:02

afficher la liste les éléments sont cliquables. Pour l'utiliser, vous devez définir élément, cliquez sur l'écouteur sur votre liste. Ensuite, il sera.

1
répondu Mitt 2013-04-11 00:48:52

je suis assez en retard, mais a découvert quelque chose que je pense qu'il est intéressant à ce sujet:

si votre adaptateur descend de ArrayAdapter, autant que j'ai essayé, onItemClickListener n'est pas appelé.

cependant, si votre adaptateur descend de BaseAdapter (donc vous devez implémenter getCount () et getItem (), trivial pour un tableau) il est toujours appelé.

1
répondu rupps 2013-05-28 21:02:50

j'ai été en utilisant un écran et un bouton à l'intérieur de la vue de liste, de sorte que j'ai utilisé:

android:focusable="false"

<button> et <view> ...

après cela j'ai utilisé le code suivant pour ma vue de liste et cela a fonctionné

// Attach the adapter to a ListView
ListView listView = (ListView) findViewById(R.id.shipping_item_list);
listView.setAdapter(adapter);
listView.setOnItemClickListener(listPairedClickItem);

private AdapterView.OnItemClickListener listPairedClickItem = new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {

    Toast.makeText(getBaseContext(), "Item ", Toast.LENGTH_LONG).show();
    }
};
1
répondu Vinod Joshi 2015-04-09 09:29:36

Pour moi, le problème était que mes articles dans mon ListView a clickabletrue.

0
répondu Karim Varela 2016-03-30 00:28:55

définir android:cliquable="false" android: focusable= "fasle"

-2
répondu Yajneshwar Mandal 2013-02-21 12:17:15