ListView setOnItemClickListener no funciona al agregar el botón

Tengo una vista de lista con texto y botón en cada fila, la vista de lista setOnItemClickListener () no está funcionando. ¿Es posible manejar el clic del elemento y hacer clic en los eventos del botón de forma diferente? (el clic del elemento debe llamar a ActivityA y el clic del botón debe llamar a ActivityB). Alguien tiene una solución

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(); } String s = userNameArr.get(position)+","+userIDArr.get(position); holder.UserNameAndID.setText(s); holder.Description.setText("U r in middle"); return rowView; } } }` 

Intente configurar sus botones (o cualquier otra vista que desee manejar haga clic dentro de un elemento de la lista) de esta manera:

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

A veces, la Lista aún no podrá hacer que pase el Escuchador de clics. Y en este caso, es posible que deba agregar un atributo más.

 android:descendantFocusability="blocksDescendants" 

Y este atributo debe agregarse a la distribución más alta de su XML donde haya proporcionado los elementos ListView.

Si tiene una vista / vista onItemClickListener activa en su vista de lista, deshabilitará onItemClickListener … puede intentar que no sea enfocable agregando: android:focusable="false" a cualquier vista que normalmente sea enfocable.

La rowView del rowView es agregar ambos Listener al conjunto de rowView y al Button dentro del Adapter . Algo como esto.

 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(String.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().toString()); Toast.makeText(context,"Item in position " + pos + " clicked",Toast.LENGTH_LONG).show(); } } 

Intenta configurar setClickable (false) para cada botón, ImageButton, etc. y ve así:

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

También tienes que agregar

 android:descendantFocusability="blocksDescendants" 

al diseño principal (primer nivel)

En lugar de agregar el botón, agregue la vista de imagen y proporcione setOnitemclcik listner, que funcionaría 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; } 

No sé exactamente por qué, pero a veces, cuando configuras el adaptador, los oyentes se borran. Luego, debe llamar a setOnClickListener después de setAdapter o setListAdapter.

También recibo el mismo error. Si en el diseño de la lista tiene un botón, reemplácelo con textView, es decir ImageButton con ImageView. Para referencia, es mi código:

  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){ String data = Integer.toString(itemListsItems.get(position).id); Toast.makeText(v.getContext(),"fav hai "+data,Toast.LENGTH_SHORT).show(); pref.addPref(data); } else { String data = Integer.toString(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){ String data = Integer.toString(itemListsItems.get(position).id); Toast.makeText(convertView.getContext(),"fav hai "+data,Toast.LENGTH_SHORT).show(); pref.addPref(data); } else { String data = Integer.toString(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; } 

También tenga en cuenta para hacer el diseño de la lista como android: focussable = “true” y para ese parámetro de botón / texto use android: focussable = “false”

eliminar android: clickable = “true” de la vista disfrazada interna de la listaVer

Haga que el atributo padre cliqueable sea falso como este ‘ android: clickable = “false” ‘.

   

Nuevamente enfrentando un problema, entonces para todas las vistas secundarias, agregue este clic en falso.

Agregue el atributo android: focusable = “false” al botón y a la vista principal agregue el atributo android: descenddantFocusability = “blocksDescendants” como este.