studio programacion libros gratis android listview listview-adapter

android - programacion - ¿Cómo agrego un OnClickListener a un botón dentro de un adaptador ListView?



programacion android pdf 2018 (3)

Tengo una vista de lista que contiene la lista de todos mis usuarios. Cada elemento de la lista es un diseño que tiene un botón para mostrar un AlertDialog para cambiar el valor de la etiqueta del botón. ¿Cómo puedo agregar dinámicamente un evento de clic en ese botón generado por el adaptador de vista de lista?

Este es mi adaptador:

public class PerfilAdapter extends BaseAdapter { Context mContext; LayoutInflater mLayoutInflater; List<PerfilBean> listaPerfiles = new ArrayList<PerfilBean>(); public Settings01 set=new Settings01(); public PerfilAdapter(Context context,List<PerfilBean> lista) { mContext = context; mLayoutInflater = (LayoutInflater) mContext .getSystemService(Context.LAYOUT_INFLATER_SERVICE); listaPerfiles=lista; } @Override public int getCount() { // TODO Auto-generated method stub return listaPerfiles.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return listaPerfiles.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { RelativeLayout itemView; if (convertView == null) { itemView = (RelativeLayout) mLayoutInflater.inflate( R.layout.item_perfil, parent, false); } else { itemView = (RelativeLayout) convertView; } // obtengo los valores de la vista Button moneda = (Button) itemView.findViewById(R.id.Moneda); TextView titulo = (TextView) itemView.findViewById(R.id.Titulo); TextView nombredesc = (TextView) itemView.findViewById(R.id.txtNombre); TextView descripcion = (TextView) itemView.findViewById(R.id.txtDescripcion); String nombreM = Metodos.monedas[listaPerfiles.get(position).getPerfil_tipoMoneda()]; moneda.setText(nombreM); titulo.setText(listaPerfiles.get(position).getPerfil_nombre()); nombredesc.setText(listaPerfiles.get(position).getPerfil_nombreSec()); descripcion.setText(listaPerfiles.get(position).getPerfil_texto()); return itemView; } // metodo parahacer la vista de la celda public void actualizaDatosLista(List<PerfilBean> listaPerfilesM) { for(int i=0;i<listaPerfilesM.size();i++){ Log.d("ITEM "+i,listaPerfilesM.get(i).getPerfil_nombreSec()); } listaPerfiles = listaPerfilesM; notifyDataSetChanged(); }}

y esta es mi actividad:

public class Settings01 extends Activity implements OnClickListener { private List<PerfilBean> lst; private PerfilDAO perfildao; private PerfilAdapter perfiladapter; private ListView lstPerfiles; public void changeMoneda(final int position) { int x = 0; AlertDialog.Builder builder = new AlertDialog.Builder(Settings01.this); builder.setTitle("Seleccione Tipo de Distribuidor"); builder.setItems(R.array.moneda, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { lst.get(position).setPerfil_tipoMoneda(item); perfiladapter = new PerfilAdapter(getApplicationContext(), lst); lstPerfiles.setAdapter(perfiladapter); dialog.dismiss(); } }); builder.create(); builder.show(); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.settings01); lstPerfiles = (ListView) findViewById(R.id.lstSettings); perfildao = new PerfilDAOImplDB(Settings01.this); lst = new ArrayList<PerfilBean>(); lst = perfildao.getAll(); perfiladapter = new PerfilAdapter(getApplicationContext(), lst); Log.d("Info", "En Settings"); lstPerfiles.setAdapter(perfiladapter); } @Override public void onClick(View v) { Log.d("Info", "derp" + v.getId()); }}

Este es el diseño que mi adaptador está usando actualmente:

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/Titulo" android:layout_width="wrap_content" android:layout_height="40dp" android:layout_alignParentLeft="true" android:layout_marginLeft="150dp" android:gravity="left|center_vertical" android:textColor="@color/Negro" android:text="derp" /> <TextView android:id="@+id/lblTipoMoneda" android:layout_width="120dp" android:layout_height="40dp" android:layout_toLeftOf="@+id/Moneda" android:gravity="left|center_vertical" android:text="Tipo de moneda: " /> <Button android:id="@+id/Moneda" android:layout_width="160dp" android:layout_height="40dp" android:layout_alignParentRight="true" android:layout_marginRight="150dp" android:gravity="left|center_vertical" android:background="@color/Blanco" android:textColor="@color/Negro" android:text="Peso argentino" /> <ImageView android:id="@+id/Separador" android:layout_width="match_parent" android:layout_height="2.5dp" android:layout_below="@+id/Moneda" android:layout_marginLeft="150dp" android:layout_marginRight="150dp" android:background="@color/Negro" /> <TextView android:id="@+id/Nombre" android:layout_width="wrap_content" android:layout_height="40dp" android:layout_alignParentLeft="true" android:layout_below="@+id/Separador" android:layout_marginLeft="150dp" android:layout_marginTop="10dp" android:clickable="true" android:gravity="left|center_vertical" android:onClick="changeMoneda" android:text="Nombre :" /> <EditText android:id="@+id/txtNombre" android:layout_width="200dp" android:layout_height="40dp" android:layout_below="@+id/Separador" android:layout_marginTop="10dp" android:layout_toRightOf="@+id/Nombre" android:background="@drawable/fondotxt" android:textColor="@color/Negro" android:inputType="text" /> <TextView android:id="@+id/lblTitulo" android:layout_width="360dp" android:layout_height="24dp" android:layout_below="@+id/txtNombre" android:layout_marginTop="10dp" /> <EditText android:id="@+id/txtDescripcion" android:layout_width="match_parent" android:layout_height="200dp" android:layout_below="@+id/lblTitulo" android:layout_marginLeft="150dp" android:layout_marginRight="150dp" android:textColor="@color/Negro" android:gravity="left|center_vertical" /> <ImageView android:id="@+id/imgPicturefantes" android:layout_width="100dp" android:layout_height="150dp" android:layout_below="@+id/txtDescripcion" android:layout_toLeftOf="@+id/lblFotoAntes" android:src="@drawable/what" /> <ImageView android:id="@+id/imgPicturefdespues" android:layout_width="100dp" android:layout_height="150dp" android:layout_below="@+id/txtDescripcion" android:layout_marginLeft="50dp" android:layout_toRightOf="@+id/centerPoint" android:src="@drawable/what" /> <TextView android:id="@+id/lblFotoDespues" android:layout_width="120dp" android:layout_height="50dp" android:layout_below="@+id/txtDescripcion" android:layout_marginTop="50dp" android:layout_toRightOf="@+id/imgPicturefdespues" android:gravity="center" android:text="Foto despues: " android:textSize="18sp" /> <ImageButton android:id="@+id/btnDespuesF" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@+id/btnAntesF" android:layout_toRightOf="@+id/imgPicturefdespues" android:background="@drawable/btnupload" /> <TextView android:id="@+id/centerPoint" android:layout_width="2dp" android:layout_height="2dp" android:layout_below="@+id/txtDescripcion" android:layout_centerHorizontal="true" /> <TextView android:id="@+id/lblFotoAntes" android:layout_width="100dp" android:layout_height="50dp" android:layout_below="@+id/txtDescripcion" android:layout_marginRight="50dp" android:layout_marginTop="50dp" android:layout_toLeftOf="@+id/centerPoint" android:gravity="center" android:text="Foto antes: " android:textSize="18sp" /> <ImageButton android:id="@+id/btnAntesF" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/lblFotoAntes" android:layout_marginRight="75dp" android:layout_toLeftOf="@+id/centerPoint" android:background="@drawable/btnupload" />


En mi caso tuve que agregar este atributo en el listView:

<ListView ... android:clickable="true" ... </ListView>

Y en el adaptador simplemente agregue al oyente de clic en la vista de botón.

wrapper.getButtonHi().setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub DebugUtils.logDebug("Clickeado :: "+ mContact.getUserId()); } });

Es importante establecer las variables finales:

public View getRowView(final int position, View convertView, ViewGroup parent) { final BrowseContactItemWrapper wrapper; final UserModel mContact = lstContact.get(position); ..... }


Puede hacerlo en el método getView() de su adaptador. Para eso necesitarás usar un adaptador personalizado (si aún no lo estás haciendo). Será mejor si puede mostrar las partes relevantes de su código.

EDITAR: El diálogo se mostrará por su actividad. Así que puedes crear una interfaz para escuchar este evento de clic de botón.

public interface BtnClickListener { public abstract void onBtnClick(int position); }

Deja que tu adaptador personalizado lo reciba como entrada.

private BtnClickListener mClickListener = null; public PerfilAdapter(Context context, List<PerfilBean> lista, BtnClickListener listener) { mContext = context; mLayoutInflater = (LayoutInflater) mContext .getSystemService(Context.LAYOUT_INFLATER_SERVICE); listaPerfiles=lista; mClickListener = listener; }

Ahora, simplemente puede configurar el onClickListener normal en getView() como se muestra a continuación

Button moneda = (Button) itemView.findViewById(R.id.Moneda); moneda.setTag(position); //For passing the list item index moneda.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub if(mClickListener != null) mClickListener.onBtnClick((Integer) v.getTag()); } });

Permita que su actividad pase el BtnClickListener requerido como parte de la creación del adaptador.

perfiladapter = new PerfilAdapter(getApplicationContext(), lst, new BtnClickListener() { @Override public void onBtnClick(int position) { // TODO Auto-generated method stub // Call your function which creates and shows the dialog here changeMoneda(position); } });

Suponiendo que lst.get(position).setPerfil_tipoMoneda(item); cambia el texto que se utilizará como texto de botón correctamente, simplemente debe llamar a perfiladapter.notifyDataSetChanged() en el onClick de su dialog de dialog (actualmente está creando el adaptador nuevamente, lo cual no es necesario).

public void onClick(DialogInterface dialog, int item) { lst.get(position).setPerfil_tipoMoneda(item); perfiladapter.notifyDataSetChanged(); dialog.dismiss(); }

Espero que funcione como esperas que funcione.


Sólo un pequeño ajuste para actualizar el renderizador desde el exterior.

final FinalMenuListAdapter adapter = this; viewHolder.deleteItem.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(mClickListener != null) mClickListener.onBtnClick((MenuItemObject)v.getTag(),adapter); } }); final MenuItemObject menuItemObject = getItem(position); viewHolder.deleteItem.setTag(menuItemObject);