2013-11-21 16 views
15

Ho una listview che contiene l'elenco di tutti i miei utenti. Ogni elemento dell'elenco è un layout che dispone di un pulsante per mostrare un AlertDialog per modificare il valore dell'etichetta del pulsante. Come posso aggiungere dinamicamente un evento on-click a quel pulsante che viene generato dall'adattatore listview?Come aggiungere un onclicklistener a un pulsante all'interno di un adattatore listview?

Questo è il mio adattatore:

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

e questa è la mia attività:

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

}} 

Questo è il layout che mio adattatore sta utilizzando:

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

Guarda qui http: // StackOverflow.com/a/10357063/1868912 – Dima

risposta

29

Puoi fallo nel metodo getView() del tuo adattatore. Per questo dovrai usare un adattatore personalizzato (se non lo fai già). Sarà meglio se puoi mostrare le parti rilevanti del tuo codice.

MODIFICA: La finestra di dialogo verrà visualizzata dall'attività. Quindi puoi creare un'interfaccia per ascoltare questo evento clic sul pulsante.

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

Consenti al tuo adattatore personalizzato di riceverlo come input.

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

Ora si può semplicemente impostare il normale onClickListener in getView() come di seguito

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

Si compia la tua attività di passare il BtnClickListener richiesto come parte della creazione adattatore.

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

}); 

Supponendo che lst.get(position).setPerfil_tipoMoneda(item); cambia il testo che verrà utilizzato come testo del pulsante in modo corretto, si dovrebbe semplicemente chiamare perfiladapter.notifyDataSetChanged() nel onClick del vostro dialog (Attualmente si sta creando l'adattatore di nuovo che non è necessario).

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

Spero che funzioni come ci si aspetta.

+0

ho un adattatore personalizzato ma ho bisogno della scheda per avere il pulsante Moneda deve apparire un alerdialog per mostrare l'opzione dopo che l'utente seleziona l'etichetta del pulsante deve cambiare che dipende dalla selezione – user2981113

+1

Grazie un sacco di uomini ... L'hai spiegato molto bene. Sono stato anche bloccato con il problema simile, ma mi hai salvato .. –

+0

Non funziona per me per qualche motivo .. – God

0

Nel mio caso ho dovuto aggiungere questo attributo nel listView:

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

E l'adattatore è sufficiente aggiungere al clic ascoltatore nella vista pulsante.

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

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

la sua importante per impostare le variabili finale:

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

Solo un piccolo tweak per aggiornare il renderer dall'esterno.

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