すべてのユーザーのリストを含むリストビューがあります。リストのすべてのアイテムは、ボタンのラベルの値を変更するAlertDialogを表示するボタンを持つレイアウトです。リストビューアダプターによって生成されるボタンにon clickイベントを動的に追加するにはどうすればよいですか?
これは私のアダプターです:
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" />
これは、アダプターの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;
}
次のように、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());
}
});
アダプター作成の一部として、アクティビティが必要な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);
がボタンテキストとして使用されるテキストを正しく変更すると仮定すると、onClick
のdialog
でperfiladapter.notifyDataSetChanged()
を呼び出すだけです(現在はアダプターを再度作成する必要はありません)。
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);