ListView setOnItemClickListener ne fonctionne pas en ajoutant un bouton

J’ai une vue de liste avec du texte et un bouton dans chaque ligne, la vue liste setOnItemClickListener () ne fonctionne pas. est-il possible de gérer les événements de clic sur un élément et de clic sur un bouton différemment? Quelqu’un a-t-il une solution

private ArrayList userIDArr = null; private ArrayList userNameArr = null; private DatabaseHelper dbHelper = null; private ListView userListView=null; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.list_view); dbHelper = new DatabaseHelper(this.getApplicationContext()); Map<String,ArrayList> displayMap = dbHelper.getUserListToDisplay(); userIDArr = displayMap.get("UserID"); userNameArr = displayMap.get("FirstName1"); userListView = (ListView) findViewById(R.id.listView2); userListView.setAdapter(new UserListAdapter(this,userIDArr)); userListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView arg0, View arg1, int position, long arg3) { Toast.makeText(usersListActivity.this, "Item in position " + position + " clicked", Toast.LENGTH_LONG).show(); } }); } public class UserListAdapter extends ArrayAdapter { Activity context; public UserListAdapter(Activity context, ArrayList names) { super(context, R.layout.list_item, names); this.context = context; } private class ViewHolder { public TextView UserNameAndID; public TextView Description; public Button UploadBtn; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; View rowView = convertView; if (rowView == null) { LayoutInflater inflater = context.getLayoutInflater(); rowView = inflater.inflate(R.layout.list_item, null, true); holder = new ViewHolder(); holder.UserNameAndID = (TextView) rowView.findViewById(R.id.User_detailsTxt); holder.Description = (TextView) rowView.findViewById(R.id.User_status); holder.UploadBtn = (Button) rowView.findViewById(R.id.uploadbutton); holder.UploadBtn.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { Toast.makeText(usersListActivity.this," Button clicked",Toast.LENGTH_SHORT).show(); } }); rowView.setTag(holder); } else { holder = (ViewHolder) rowView.getTag(); } Ssortingng s = userNameArr.get(position)+","+userIDArr.get(position); holder.UserNameAndID.setText(s); holder.Description.setText("U r in middle"); return rowView; } } }` 

Essayez de définir vos boutons (ou toute autre vue que vous souhaitez gérer en cliquant dans un élément de liste) comme ceci:

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

Parfois, la liste ne pourra toujours pas transmettre le Click Listener. Et dans ce cas, vous devrez peut-être append un atsortingbut supplémentaire.

 android:descendantFocusability="blocksDescendants" 

Et cet atsortingbut doit être ajouté à la disposition la plus haute de votre XML où vous avez fourni les éléments ListView.

Si vous avez une vue active / visible dans votre vue liste, elle désactivera onItemClickListener … vous pouvez essayer de la rendre impossible en ajoutant: android:focusable="false" à toute vue qui est généralement focalisable.

Le problème de la rowView est d’append à la fois Listener à l’ensemble du rowView et au Button intérieur de l’ Adapter . Quelque chose comme ça.

 public class MyAdapter extends BaseAdapter implements View.OnClickListener{ @Override public View getView(int position, View convertView, ViewGroup parent) { View rowView = convertView; if(rowView == null) { //intialize rowView, and set onclick listener only once. rowView = someIntilizationMehhodOrInflatorMethod(); //add listener to the button also and also to the row view rowView.setOnClickListener(this); } //all your inflation and setting values goes here and at the end, //set position as tag to get the correct position, rather buggy one. rowView.setTag(Ssortingng.valueOf(position)); return rowView; } public void onClick(View v) { //now get the tag of View v and convert it to integer. int pos = Integer.parseInt(v.getTag().toSsortingng()); Toast.makeText(context,"Item in position " + pos + " clicked",Toast.LENGTH_LONG).show(); } } 

Essayez set setClickable (false) pour chaque Button, ImageButton, etc et View comme ceci:

  view.setClickable(false); button.setClickable(false); imagebutton.setClickable(false); 

Aussi vous devez append

 android:descendantFocusability="blocksDescendants" 

à la disposition principale (premier niveau)

Au lieu d’append un bouton, ajoutez imageview et fournissez setOnitemclcik listner qui fonctionnerait bien

  public View getView(final int position, View convertView, ViewGroup parent) { MyViewHolder mViewHolder; if(convertView == null) { convertView = inflater.inflate(R.layout.youtubesearchrow, null); mViewHolder = new MyViewHolder(); mViewHolder.alarm = (ImageView)convertView.findViewById(R.id.alarm); convertView.setTag(mViewHolder); } else { mViewHolder = (MyViewHolder) convertView.getTag(); } mViewHolder.tvTitle = detail(convertView, R.id.tvTitle, // mViewHolder.tvDesc = detail(convertView, R.id.tvDesc, mViewHolder.ivIcon = detail_image(convertView, R.id.ivIcon, mViewHolder.alarm.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub } }); return convertView; } 

Je ne sais pas exactement pourquoi, mais parfois, lorsque vous définissez l’adaptateur, les écouteurs sont effacés. Ensuite, vous devez appeler setOnClickListener après setAdapter ou setListAdapter.

Je reçois aussi la même erreur. Si dans la liste vous avez un bouton, remplacez-le par textView, c’est-à-dire ImageButton avec ImageView. Pour référence, c’est mon code:

  private Activity activity; private LayoutInflater inflater; private List itemListsItems; private Bookmark_SharedPref pref; ImageLoader imageLoader = AppController.getInstance().getImageLoader(); public CustomListAdapter_Item(Activity activity,List itemListsItems){ this.activity=activity; this.itemListsItems=itemListsItems; pref = new Bookmark_SharedPref(activity); } @Override public int getCount() { return itemListsItems.size(); } @Override public Object getItem(int position) { return itemListsItems.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { View v = convertView; ViewHolder holder; if(inflater == null){ inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } if(convertView == null){ convertView = inflater.inflate(R.layout.item_layout,null); holder = new ViewHolder(); convertView.setTag(holder); } else{ holder = (ViewHolder)convertView.getTag(); } if(imageLoader == null){ imageLoader = AppController.getInstance().getImageLoader(); } holder.img = (NetworkImageView)convertView.findViewById(R.id.item_image); holder.Title = (TextView)convertView.findViewById(R.id.item_title); holder.Cat = (TextView)convertView.findViewById(R.id.item_category); holder.id = (TextView)convertView.findViewById(R.id.itemid); holder.Desc = (TextView)convertView.findViewById(R.id.item_description); holder.book = (ImageView)convertView.findViewById(R.id.bookmark_star); // getting blog data or the row ItemList il = itemListsItems.get(position); //setting image holder.img.setImageUrl(il.getImageUrl(), imageLoader); // setting title holder.Title.setText(il.getTitle()); //setting category holder.Cat.setText(il.getCategory()); //setting blog id holder.id.setText(il.getId()); //setting description holder.Desc.setText(il.getDescription()); //bookmarking the post holder.book.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { itemListsItems.get(position).isFav = !itemListsItems.get(position).isFav; ((ImageView)v.findViewById(R.id.bookmark_star)).setImageResource(itemListsItems.get(position).isFav ? R.mipmap.active_star : R.mipmap.inactive_star); if(itemListsItems.get(position).isFav){ Ssortingng data = Integer.toSsortingng(itemListsItems.get(position).id); Toast.makeText(v.getContext(),"fav hai "+data,Toast.LENGTH_SHORT).show(); pref.addPref(data); } else { Ssortingng data = Integer.toSsortingng(itemListsItems.get(position).id); Toast.makeText(v.getContext(),"not fav"+ data,Toast.LENGTH_SHORT).show(); pref.removePref(data); } //notifyDataSetChanged(); } }); ((ImageView)convertView.findViewById(R.id.bookmark_star)).setImageResource(itemListsItems.get(position).isFav ? R.mipmap.active_star : R.mipmap.inactive_star); /* if(itemListsItems.get(position).isFav){ Ssortingng data = Integer.toSsortingng(itemListsItems.get(position).id); Toast.makeText(convertView.getContext(),"fav hai "+data,Toast.LENGTH_SHORT).show(); pref.addPref(data); } else { Ssortingng data = Integer.toSsortingng(itemListsItems.get(position).id); //Toast.makeText(convertView.getContext(),"not fav"+ data,Toast.LENGTH_SHORT).show(); pref.removePref(data); } */ return convertView; } private static class ViewHolder { public TextView Title, Desc,Cat,id; ImageView book; NetworkImageView img; } 

Gardez également à l’esprit de faire la mise en page de la liste sous Android: focussable = “true” et pour ce paramètre bouton / texte, utilisez android: focussable = “false”

supprimer android: clickable = “true” de la vue costumed interne de la listeView

Définissez l’atsortingbut cliquable parent sur false comme ceci ‘ android: clickable = “false” ‘.

   

Encore une fois confronté à un problème, alors pour toutes les vues enfant, ajoutez ce faux cliquable.

Ajouter android: focusable = “false” atsortingbut au bouton et à la vue parente append android: descendantFocusability = “blocksDescendants” comme ceci.