with studio programacion móviles desarrollo curso aplicaciones android listview

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



listview with button android (9)

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"

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?


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<RequestClass> _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<RequestClass> { Context mContext; int mResource; public RequestCustomAdapter(Context context, int resource,ArrayList<RequestClass> 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:

<ListView android:layout_width="match_parent" android:layout_height="match_parent" android:focusable="true" android:id="@+id/AllRequestListView"> </ListView>

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

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/requestLayout" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/bookingTime"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/bookingTime" android:text="Temp Name" android:id="@+id/userName"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/userName" android:text="No Rating" android:id="@+id/rating"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/AcceptRequestButton" android:focusable="false" android:layout_below="@+id/rating" android:text="Accept"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/RejectRequestButton" android:layout_below="@+id/AcceptRequestButton" android:focusable="false" android:text="Reject" /> </RelativeLayout>



En su adaptador personalizado dentro del método getView:

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


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 etiquetas es útil. Aquí el botón se declara final porque se usará dentro de la clase interna.


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 casilla de verificación 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(); }


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 ...



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.