J'ai un ListView
qui utilise un adaptateur personnalisé, mais je ne peux pas cliquer sur l'élément ListView.
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);
}
}
}
disposition places_list.xml
<?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>
disposition adaptor_content.xml
<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>
essayez ceci pour obtenir le focus: View.getFocus ();
Android ne permet pas de sélectionner des éléments de liste qui ont des éléments focalisables (boutons). Modifiez l'attribut xml du bouton pour:
Android:focusable="false"
Il devrait toujours être cliquable, mais ne gagnera pas en concentration ...
J'ai eu le même problème avec un ListView qui ne contenait qu'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 RadioButton dans chaque ligne pour afficher la sélection d'éléments par défaut, pour effectuer des clics sur le gestionnaire 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'un problème lié au focus ... Avec les modificateurs ci-dessus, le focus est dirigé vers ListView en un clic.
Cette réponse a fonctionné pour moi: https://stackoverflow.com/a/16536355/5112161
Principalement, il a ajouté dans le LinearLayout ou RelativeLayout ce qui suit:
Android:descendantFocusability="blocksDescendants"
Vous devez également SUPPRIMER de tout votre xml les éléments suivants:
Android:focusable="false"
Android:focusable="true"
Android:clickable="true"
Android:clickable="false"
Je voulais ajouter un commentaire à la réponse de rupps, mais je n'ai pas assez de réputation.
Si vous utilisez un adaptateur personnalisé étendant ArrayAdapter, vous pouvez écraser avec areAllItemsEnabled () et isEnabled (int position) 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 que ce commentaire aide également les autres car le terme de recherche "Liste Android non cliquable" est assez élevé dans Google.
Pensez à rendre la valeur du texte sélectionnable en spécifiant Android: textIsSelectable = "true"
N'écoutez pas Google. Dans la disposition des lignes, définissez
textIsSelectable="false"
Merci Lint (pas!)
J'utilisais une vue et un bouton dans la vue de liste, j'ai donc utilisé:
Android:focusable="false"
pour <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();
}
};
Les éléments d'affichage de liste sont cliquables. Pour l'utiliser, vous devez définir l'écouteur de clic d'élément dans votre affichage de liste. Ensuite, cela fonctionnera.
Je suis assez en retard mais j'ai découvert quelque chose que je trouve intéressant à ce sujet:
si votre adaptateur descend d'ArrayAdapter, autant que j'ai essayé, onItemClickListener n'est pas appelé.
Cependant, si votre adaptateur descend de BaseAdapter (vous devez donc implémenter getCount () et getItem (), trivial pour un tableau), il IS toujours appelé.
Pour moi, le problème était que mes éléments dans mon ListView avaient clickable
défini sur true
.