web-dev-qa-db-fra.com

Comment ajouter un OnClickListener à un bouton à l'intérieur d'un adaptateur ListView?

J'ai une liste qui contient la liste de tous mes utilisateurs. Chaque élément de la liste est une mise en page qui a un bouton pour afficher un AlertDialog pour changer la valeur de l'étiquette du bouton. Comment puis-je ajouter dynamiquement un événement on click à ce bouton qui est généré par l'adaptateur listview?

Voici mon adaptateur:

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

et voici mon activité:

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

}}

Voici la disposition que mon adaptateur utilise actuellement:

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

Vous pouvez le faire dans la méthode getView() de votre adaptateur. Pour cela, vous devrez utiliser un adaptateur personnalisé (si vous ne le faites pas déjà). Ce sera mieux si vous pouvez montrer les parties pertinentes de votre code.

EDIT: La boîte de dialogue sera affichée par votre activité. Vous pouvez donc créer une interface pour écouter cet événement de clic de bouton.

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

Laissez votre adaptateur personnalisé le recevoir en entrée.

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

Maintenant, vous pouvez simplement définir le onClickListener normal dans getView() comme ci-dessous

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

Laissez votre activité passer le BtnClickListener requis dans le cadre de la création de l'adaptateur.

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

});

En supposant que lst.get(position).setPerfil_tipoMoneda(item); modifie correctement le texte qui sera utilisé comme texte de bouton, vous devez simplement appeler perfiladapter.notifyDataSetChanged() dans le onClick de votre dialog (actuellement vous créez à nouveau l'adaptateur qui n'est pas nécessaire).

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

J'espère que cela fonctionnera comme vous vous y attendez.

33
Rajeev

Dans mon cas, j'ai dû ajouter cet attribut dans la listView:

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

Et dans l'adaptateur, ajoutez simplement un écouteur de clic dans la vue des boutons.

wrapper.getButtonHi().setOnClickListener(new OnClickListener() {

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

Il est important de définir les variables finales:

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

Juste un petit Tweak pour rafraîchir le rendu de l'extérieur.

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