J'ai un ListView personnalisé avec deux boutons et quand je clique sur l'un des boutons d'une rangée quelconque, je veux obtenir l'étiquette de texte sur la vue en liste et, pour l'instant, affiche simplement un pain grillé. Jusqu'à présent, rien n'a fonctionné, je continue à obtenir le dernier élément de mon tableau.
Voici une capture d'écran pour vous donner une meilleure idée de ce que je veux dire
Voici ma sous-classe d'adaptateur pour mon ListView personnalisé
static final String[] Names =
new String[] { "John", "Mike", "Maria", "Miguel"};
class MyArrayAdapter extends ArrayAdapter<String> {
private final Context context;
int which;
public MyArrayAdapter(Context context, String[] pValues) {
super(context, R.layout.main, pValues);
this.context = context;
values = pValues;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
rowView = inflater.inflate(R.layout.main, parent, false);
TextView textView = (TextView) rowView.findViewById(R.id.label);
ImageView imageView = (ImageView) rowView.findViewById(R.id.logo);
Button call = (Button) rowView.findViewById(R.id.button1);
Button chat = (Button) rowView.findViewById(R.id.button2);
textView.setText(values[position]);
// Change icon based on name
s = values[position];
which = position;
call.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String name = values[which];
Toast.makeText(CustomListView.this, name, Toast.LENGTH_SHORT).show();
}
});
return rowView;
}
}
Modifier:
String name = textView.getText().toString();
RelativeLayout ll = (RelativeLayout)v.getParent();
textView = (TextView)ll.findViewById(R.id.label);
Toast.makeText(CustomListView.this, name,
Toast.LENGTH_SHORT).show();
Facile à faire:
call.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
RelativeLayout rl = (RelativeLayout)v.getParent();
TextView tv = (TextView)rl.findViewById(R.id.label);
String text = tv.getText().toString();
Toast.makeText(CustomListView.this, text, Toast.LENGTH_SHORT).show();
}
});
utiliser l'attribut setTag de la vue ..............
comme
Button call = (Button) rowView.findViewById(R.id.button1);
call.setTag(position);
et
call.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
int which = -1;
Obejct obj = v.getTag();
if(obj instaceof Integer){
which = ((Integer)obj).intValue();
}
if(which >-1){
String name = values[which];
Toast.makeText(CustomListView.this, name, Toast.LENGTH_SHORT).show();
}
}
});
Si vous avez une ListActivity et que vous n'utilisez pas votre propre adaptateur, vous pouvez toujours obtenir l'élément de la liste appartenant au bouton sélectionné, comme suit:
Dans votre fichier de disposition de la ligne de liste:
<ImageButton
Android:id="@+id/button_call"
Android:layout_height="48dip"
Android:layout_width="48dip"
Android:contentDescription="Call"
Android:onClick="callBuddy"
Android:src="@drawable/call_button_image"
/>
Dans votre ListActivity:
public void callBuddy(View view) {
int position = getListView().getPositionForView((View) view.getParent());
Buddy buddyToCall = (Buddy) getListView().getItemAtPosition(position);
Toast.makeText(MyListActivity.this, String.format("Calling your buddy %s.", buddyToCall.name), Toast.LENGTH_SHORT).show();
}
utilisez simplement getItem () et passez la position Ex: getItem(position).getID()
ici la méthode getID () est une méthode getter
Définissez onClick = "click" sur xml de button/image/etc ...
et dans votre activité, faites:
public void click(View v) {
final int position = getListView().getPositionForView(v);
String text = getListView().getItemAtPosition(position).toString();
Toast.makeText(getApplicationContext, text, Toast.LENGTH_SHORT).show();
}