Android: Cómo establecer el evento onClick para Button en el elemento List de ListView

Deseo agregar el evento onClick para los botones utilizados en el elemento de Listview . ¿Cómo puedo dar el evento onClick para los botones en el elemento de la lista?

Puede configurar el evento onClick en el método getView su adaptador personalizado.
revise el enlace http://androidforbeginners.blogspot.it/2010/03/clicking-buttons-in-listview-row.html

En clase de adaptador

 public View getView(final int position, View convertView, ViewGroup parent) { LayoutInflater inflater = getLayoutInflater(); View row = inflater.inflate(R.layout.vehicals_details_row, parent, false); Button deleteImageView = (Button) row.findViewById(R.id.DeleteImageView); deleteImageView.setOnClickListener(new OnClickListener() { public void onClick(View v) { //... } }); } 

Pero puede obtener un problema: la fila listView no se puede hacer clic . Solución:

  • hacer que ListView focusable android:focusable="true"
  • Botón no enfocable android:focusable="false"

Prueba esto,

 public View getView(final int position, View convertView,ViewGroup parent) { if(convertView == null) { LayoutInflater inflater = getLayoutInflater(); convertView = (LinearLayout)inflater.inflate(R.layout.YOUR_LAYOUT, null); } Button Button1= (Button) convertView .findViewById(R.id.BUTTON1_ID); Button1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // Your code that you want to execute on this button click } }); return convertView ; } 

Puede ayudarte …

En su adaptador personalizado dentro del método getView:

 button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Do things Here } }); 

Supongo que ha definido un adaptador personalizado para su ListView.

Si este es el caso, entonces puede asignar onClickListener para su botón dentro del método getView() del adaptador personalizado.

Esto se ha discutido en muchos mensajes, pero aún así no pude encontrar una solución con:

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

La siguiente solución funcionará con cualquiera de los componentes de la interfaz de usuario: Button, ImageButtons, ImageView, Textview. LinearLayout, RelativeLayout hace clic dentro de una celda de vista de lista y también responderá a onItemClick:

Clase de adaptador – getview ():

  @Override public View getView(int position, View convertView, ViewGroup parent) { View view = convertView; if (view == null) { view = lInflater.inflate(R.layout.my_ref_row, parent, false); } final Organization currentOrg = organizationlist.get(position).getOrganization(); TextView name = (TextView) view.findViewById(R.id.name); Button btn = (Button) view.findViewById(R.id.btn_check); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { context.doSelection(currentOrg); } }); if(currentOrg.isSelected()){ btn.setBackgroundResource(R.drawable.sub_search_tick); }else{ btn.setBackgroundResource(R.drawable.sub_search_tick_box); } } 

En este caso, puede obtener el objeto con el botón de clic para la actividad. (Especialmente cuando quiere que el botón actúe como una checkbox con estados seleccionados y no seleccionados):

  public void doSelection(Organization currentOrg) { Log.e("Btn clicked ", currentOrg.getOrgName()); if (currentOrg.isSelected() == false) { currentOrg.setSelected(true); } else { currentOrg.setSelected(false); } adapter.notifyDataSetChanged(); } 

En el método getview pongo al oyente afuera revisando la vista … bash seguir esto … funcionó en mi caso … ¿Cómo boost o disminuir el valor de edittext en listview en cada fila?

Clase para ArrayList y ArrayAdapter

 class RequestClass { private String Id; private String BookingTime; private String UserName; private String Rating; public RequestClass(String Id,String bookingTime,String userName,String rating){ this.Id=Id; this.BookingTime=bookingTime; this.UserName=userName; this.Rating=rating; } public String getId(){return Id; } public String getBookingTime(){return BookingTime; } public String getUserName(){return UserName; } public String getRating(){return Rating; } } 

Actividad principal:

  ArrayList _requestList; _requestList=new ArrayList<>(); try { JSONObject jsonobject = new JSONObject(result); JSONArray JO = jsonobject.getJSONArray("Record"); JSONObject object; for (int i = 0; i < JO.length(); i++) { object = (JSONObject) JO.get(i); _requestList.add(new RequestClass( object.optString("playerID"),object.optString("booking_time"), object.optString("username"),object.optString("rate") )); }//end of for loop RequestCustomAdapter adapter = new RequestCustomAdapter(context, R.layout.requestlayout, _requestList); listView.setAdapter(adapter); 

Clase de adaptador personalizado

 import android.content.Context; import android.support.annotation.NonNull; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import java.util.ArrayList; /** * Created by wajid on 1/12/2018. */ class RequestCustomAdapter extends ArrayAdapter { Context mContext; int mResource; public RequestCustomAdapter(Context context, int resource,ArrayList objects) { super(context, resource, objects); mContext=context; mResource=resource; } public static class ViewHolder{ RelativeLayout _layout; TextView _bookingTime; TextView _ratingTextView; TextView _userNameTextView; Button acceptButton; Button _rejectButton; } @NonNull @Override public View getView(final int position, View convertView, ViewGroup parent){ final ViewHolder holder; if(convertView == null) { LayoutInflater inflater=LayoutInflater.from(mContext); convertView=inflater.inflate(mResource,parent,false); holder=new ViewHolder(); holder._layout = convertView.findViewById(R.id.requestLayout); holder._bookingTime = convertView.findViewById(R.id.bookingTime); holder._userNameTextView = convertView.findViewById(R.id.userName); holder._ratingTextView = convertView.findViewById(R.id.rating); holder.acceptButton = convertView.findViewById(R.id.AcceptRequestButton); holder._rejectButton = convertView.findViewById(R.id.RejectRequestButton); holder._rejectButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(mContext, holder._rejectButton.getText().toString(), Toast.LENGTH_SHORT).show(); } }); holder.acceptButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(mContext, holder.acceptButton.getText().toString(), Toast.LENGTH_SHORT).show(); } }); convertView.setTag(holder); } else{ holder=(ViewHolder)convertView.getTag(); } holder._bookingTime.setText(getItem(position).getBookingTime()); if(!getItem(position).getUserName().equals("")){ holder._userNameTextView.setText(getItem(position).getUserName()); } if(!getItem(position).getRating().equals("")){ holder._ratingTextView.setText(getItem(position).getRating()); } return convertView; } } 

ListView en xml principal:

   

Diseño de recursos para la vista de lista requestlayout.xml:

        

Encuentro

 final Button yourButton = (Button)view.findViewById(R.id.your_button); yourButton.setFocusable(false); yourButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ...///); 

puede resolver el problema Si desea obtener algunos datos al hacer clic en el botón, usar tags es útil. Aquí el botón se declara final porque se usará dentro de la clase interna.

PARA USUARIOS DE KOTLIN

dentro de su método getView (…) si intenta iniciar una actividad a través del botón onClickListener:

  myButton.setOnClickListener{ val intent = Intent(this@CurrentActivity, SecondActivity::class.java) startActivity(intent) } 

Pase el puntero correcto para “esto”