Ich hoffe ich kann hier helfen. Ich gehe davon aus, dass Sie ein benutzerdefiniertes Layout für listView-Elemente haben und dieses Layout aus Schaltflächen und einigen anderen Ansichten besteht - wie TextView, ImageView oder was auch immer. Jetzt möchten Sie, dass beim Klicken auf die Schaltfläche ein anderes Ereignis und bei allen anderen Klicks ein anderes Ereignis ausgelöst wird.
Sie können dies erreichen, ohne onListItemClick () Ihrer ListActivity zu verwenden.
Folgendes müssen Sie tun:
Sie verwenden ein benutzerdefiniertes Layout, daher überschreiben Sie wahrscheinlich die getView () -Methode Ihres benutzerdefinierten Adapters. Der Trick besteht darin, die verschiedenen Listener für Ihre Schaltfläche und für die gesamte Ansicht (Ihre Zeile) unterschiedlich einzustellen. Schauen Sie sich das Beispiel an:
private class MyAdapter extends ArrayAdapter<String> implements OnClickListener {
public MyAdapter(Context context, int resource, int textViewResourceId,
List<String> objects) {
super(context, resource, textViewResourceId, objects);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
String text = getItem(position);
if (null == convertView) {
convertView = mInflater.inflate(R.layout.custom_row, null);
}
//take the Button and set listener. It will be invoked when you click the button.
Button btn = (Button) convertView.findViewById(R.id.button);
btn.setOnClickListener(this);
//set the text... not important
TextView tv = (TextView) convertView.findViewById(R.id.text);
tv.setText(text);
//!!! and this is the most important part: you are settin listener for the whole row
convertView.setOnClickListener(new OnItemClickListener(position));
return convertView;
}
@Override
public void onClick(View v) {
Log.v(TAG, "Row button clicked");
}
}
Ihre OnItemClickListener-Klasse könnte wie folgt deklariert werden:
private class OnItemClickListener implements OnClickListener{
private int mPosition;
OnItemClickListener(int position){
mPosition = position;
}
@Override
public void onClick(View arg0) {
Log.v(TAG, "onItemClick at position" + mPosition);
}
}
Natürlich werden Sie dem OnItemClickListener-Konstruktor wahrscheinlich weitere Parameter hinzufügen.
Und eine wichtige Sache - die oben gezeigte Implementierung von getView ist ziemlich hässlich. Normalerweise sollten Sie das ViewHolder-Muster verwenden, um findViewById-Aufrufe zu vermeiden. Aber das wissen Sie wahrscheinlich bereits.
Meine custom_row.xml-Datei ist RelativeLayout mit Button der ID "button", TextView der ID "text" und ImageView der ID "image" - nur um die Dinge klarer zu machen.
Grüße!