2013-11-21 11 views
15

Ich habe eine Listenansicht, die die Liste aller meiner Benutzer enthält. Jedes Element aus der Liste ist ein Layout, das eine Schaltfläche zum Anzeigen eines AlertDialogs enthält, um den Wert der Beschriftung der Schaltfläche zu ändern. Wie kann ich dynamisch ein On-Click-Ereignis zu dieser Schaltfläche hinzufügen, die vom listview-Adapter generiert wird?Wie füge ich einen onclicklistener zu einer Schaltfläche in einem Listview-Adapter hinzu?

Das ist mein Adapter:

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

und dies ist meine Aktivität:

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

}} 

Dies ist das Layout, das mein Adapter zurzeit verwendet:

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

Suchen Sie hier http: // stackoverflow.com/a/10357063/1868912 – Dima

Antwort

29

Sie können Tun Sie dies in der getView() Methode Ihres Adapters. Dazu müssen Sie einen benutzerdefinierten Adapter verwenden (wenn Sie dies nicht schon tun). Es ist besser, wenn Sie die relevanten Teile Ihres Codes anzeigen können.

EDIT: Der Dialog wird durch Ihre Aktivität angezeigt. Sie können also eine Schnittstelle zum Abhören dieses Schaltflächenklickereignisses erstellen.

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

Lassen Sie Ihren benutzerdefinierten Adapter als Eingabe empfangen.

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

Jetzt können Sie einfach die normalen onClickListener in getView() nach unten

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

Ihre Aktivität Lassen Sie die erforderlichen BtnClickListener als Teil der Adaptererstellung übergeben.

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

}); 

Unter der Annahme, dass lst.get(position).setPerfil_tipoMoneda(item); den Text ändert, die korrekt als Button-Text verwendet werden, sollen Sie rufen Sie einfach perfiladapter.notifyDataSetChanged() im onClick Ihr dialog (Zur Zeit erstellen Sie den Adapter wieder, die erforderlich ist, nicht).

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

Ich hoffe, es wird funktionieren, wie Sie es erwarten.

+0

Ich habe einen benutzerdefinierten Adapter, aber ich brauche den Adapter, um den Button Moneda einen Alerdialog zu haben, um Option anzuzeigen, nachdem der Benutzer die Beschriftung der Schaltfläche auswählen muss, hängt davon ab, die Auswahl – user2981113

+1

Danke viel Mann ... Du hast es sehr gut erklärt. Ich war auch mit dem ähnlichen Problem fest, aber Sie haben mich gerettet .. –

+0

Es funktioniert nicht für mich aus irgendeinem Grund .. – God

0

In meinem Fall hatte ich dieses Attribut in der Listenansicht hinzuzufügen:

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

im Adapter hinzufügen und nur auf Klick Zuhörer in der Schaltfläche Ansicht.

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

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

Seine wichtige Finale setzen die Variablen:

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

Nur ein kleines zwicken der Renderer von außen zu aktualisieren.

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