如何将一个onclicklistener添加到列表视图适配器内的button?

我有一个列表视图,其中包含我所有用户的列表。 列表中的每个项目都是一个布局,其中有一个button,用于显示AlertDialog以更改button标签的值。 我怎样才能dynamic地添加一个点击事件的ListView适配器生成的button?

这是我的适配器:

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(); }} 

这是我的活动:

 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()); }} 

这是我的适配器当前使用的布局:

 <?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" /> 

Solutions Collecting From Web of "如何将一个onclicklistener添加到列表视图适配器内的button?"

您可以在适配器的getView()方法中执行此操作。 为此,您将需要使用自定义适配器(如果您还没有这样做)。 如果你能显示你的代码的相关部分会更好。

编辑:对话框将显示您的活动。 所以你可以创build一个接口来监听这个button的点击事件。

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

让您的自定义适配器接收它作为input。

 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; } 

现在,您可以简单地在getView()设置正常的onClickListener ,如下所示

 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()); } }); 

让您的活动作为适配器创build的一部分传递所需的BtnClickListener。

 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); } }); 

假设lst.get(position).setPerfil_tipoMoneda(item); 更改正确使用button文本的文本,您应该只需在dialogonClick中调用perfiladapter.notifyDataSetChanged() (目前您正在创build不需要的适配器)。

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

希望它能像你期望的那样工作。

在我的情况下,我不得不在listView中添加这个属性:

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

而在适配器中,只需在button视图中添加点击监听器即可。

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

确定最终variables的重要性:

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

只是一个小小的调整来刷新外部的渲染器。

 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);