Intereting Posts
Создание текстового поля типа даты для android Sqlite3_open_v2 ("/ data / data / com.android.packagename / databases / dump.sqlite", & handle, 1, NULL) не удалось Прокручиваемый linearlayout с весами больше, чем экран в android Android Broadcast Receiver для отправленных SMS-сообщений? Обрезать растровое изображение без предварительного считывания всего растрового изображения Как получить все файлы cookie с помощью CookieManager android? Как изменить размер текста в местах autocompletefragment в android? Genymotion: файл Edit / system / etc / hosts Сообщение об ошибке софт-панели Android Приложение для Android перезапускается при открытии, нажав значок приложения Камера setFocusAreas () не работает Android 4.0 Вырезать, скопировать, вставить в android Android: восстановление диалогового окна и т. Д. После изменения вращения «Имя атрибута тега <Активность> имеет недопустимый символ ''. «Android Mainfest Вызвано: java.lang.UnsatisfiedLinkError: невозможно загрузить библиотеку

Как добавить onclicklistener к кнопке внутри адаптера listview?

У меня есть список, содержащий список всех моих пользователей. Каждый элемент из списка – это макет с кнопкой, чтобы показать AlertDialog, чтобы изменить значение метки кнопки. Как я могу динамически добавлять событие на клик к этой кнопке, которая генерируется адаптером listview?

Это мой адаптер:

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 к кнопке внутри адаптера listview?"

Вы можете сделать это в getView() вашего адаптера. Для этого вам нужно будет использовать пользовательский адаптер (если вы этого уже не делаете). Будет лучше, если вы сможете показать соответствующие части вашего кода.

EDIT: диалог будет показан вашей деятельностью. Таким образом, вы можете создать интерфейс для прослушивания этого события нажатия кнопки.

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

Пусть ваш пользовательский адаптер получит его как вход.

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

Теперь вы можете просто установить обычный onClickListener в getView() как getView() ниже

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

Пусть ваша деятельность передаст необходимый 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); perfiladapter.notifyDataSetChanged() текст, который будет использоваться как текст кнопки правильно, вы должны просто вызвать perfiladapter.notifyDataSetChanged() в onClick вашего dialog (в настоящее время вы снова создаете адаптер, который не требуется).

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

Надеюсь, он будет работать так, как вы ожидаете.

В моем случае я должен был добавить этот атрибут в listView:

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

А в адаптере просто добавьте кнопку прослушивания кликов в виде кнопки.

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

Важно установить окончательные переменные:

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