web-dev-qa-db-ja.com

ListViewアダプタ内のボタンにOnClickListenerを追加するにはどうすればよいですか?

すべてのユーザーのリストを含むリストビューがあります。リストのすべてのアイテムは、ボタンのラベルの値を変更する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" />
19
user2981113

これは、アダプターの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);がボタンテキストとして使用されるテキストを正しく変更すると仮定すると、onClickdialogperfiladapter.notifyDataSetChanged()を呼び出すだけです(現在はアダプターを再度作成する必要はありません)。

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

期待どおりに機能することを願っています。

33
Rajeev

私の場合、この属性を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
Kokusho

外部からレンダラーを更新するための小さな調整。

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);
1
Ronny Shibley