Sie werden implementieren müssen einen benutzerdefinierten Adapter und stellen Sie Ihre Listener für diese Ansichten (Button
und TextView
) in der getView()
Methode manuell ein. Um die Zeile zu finden, in der Button
oder TextView
geklickt wurde, könnten Sie zuerst die Position (den Parameter, den Sie in der Methode getView()
erhalten) als Tag festlegen und dann im Listener anhand des Tags der Ansicht herausfinden, mit welcher Zeile Sie arbeiten . Die Methode onItemClick
sagt Ihnen nur, was in der Liste Zeile geklickt wurde.
Hier ist ein Beispielcode mit dem benutzerdefinierten Adapter:
class CustomCursorAdapter extends CursorAdapter {
private LayoutInflater mInflater;
private Context ctx;
public CustomCursorAdapter(Context context, Cursor c,
boolean autoRequery) {
super(context, c, autoRequery);
mInflater = LayoutInflater.from(context);
ctx = context;
}
@Override
public void bindView(View view, final Context context, Cursor cursor) {
ViewHolder holder = (ViewHolder) view.getTag();
String txt = cursor.getString(cursor.getColumnIndex("name"));
holder.text.setText(txt);
holder.button.setText(txt);
int currentPosition = cursor.getPosition();
holder.text.setTag(new Integer(currentPosition));
holder.button.setTag(new Integer(currentPosition));
OnClickListener listener = new OnClickListener() {
@Override
public void onClick(View v) {
int thePosition = (Integer) v.getTag();
if (v.getId() == R.id.button1) {
Toast.makeText(ctx,
"You clicked the Button from the row "
+ thePosition + "!", Toast.LENGTH_SHORT).show();
} else if (v.getId() == R.id.textView1) {
Toast.makeText(ctx,
"You clicked the TextView from the row "
+ thePosition + "!", Toast.LENGTH_SHORT).show();
}
}
};
holder.text.setOnClickListener(listener);
holder.button.setOnClickListener(listener);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
View v = mInflater.inflate(R.layout.adapters_cursor_adapter_clicks,
null);
ViewHolder holder = new ViewHolder();
holder.text = (TextView) v.findViewById(R.id.textView1);
holder.button = (Button) v.findViewById(R.id.button1);
v.setTag(holder);
return v;
}
class ViewHolder {
TextView text;
Button button;
}
}
Ich benutzte einen einzigen OnClickListener
für beide Ansichten, können Sie eine 2 Zuhörer für jede Ansicht followinf dem gleichen Prinzip nutzen könnten. Die vollständige Klasse + Layout-Datei finden Sie hier könnte: http://pastebin.com/uM0mb4mq (mit Kern finden Sie hier: git: //gist.github.com/2625797.git)
Vielen Dank für die Antwort. Ich muss es nicht korrekt implementieren, aber das Positionsattribut von getView() ist eigentlich die Nummer des letzten sichtbaren Elements, egal wo ich klicke. Auf welches Element sollte ich das onItemClick setzen? Ich meine mein listView ist auf Aktivitätsklasse so deklariert und meine Listener sind in der cursorAdapter-Klasse, so ... –
@SebastienFERRAND Sie nicht verstanden meine Antwort, habe ich einige Beispielcode mit einem benutzerdefinierten 'CursorAdapter' gepostet, die tun sollten was du fragst .. – Luksprog
Funktioniert perfekt, wenn (natürlich) ich den Tag das angeklickte Element bekomme. Vielen Dank. –