我有一个列表视图,其中包含我所有用户的列表。列表中的每个项目都是一个布局,其中包含一个按钮,用于显示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" />
答案 0 :(得分:32)
您可以在适配器的getView()
方法中执行此操作。为此,您将需要使用自定义适配器(如果您还没有这样做)。如果您可以显示代码的相关部分会更好。
修改强> 该对话框将显示在您的活动中。因此,您可以创建一个界面来收听此按钮单击事件。
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()
,如下所示
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()
的{{1}}内拨打onClick
(目前您正在创建)再次使用适配器,这是不需要的。)
dialog
希望它能像你期望的那样工作。
答案 1 :(得分:2)
在我的情况下,我必须在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);
.....
}
答案 2 :(得分:1)
只需稍微调整即可从外部刷新渲染器。
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);