Ich hoffe, ich kann hier helfen. Ich nehme an, dass Sie ein benutzerdefiniertes Layout für listView-Elemente haben, und dieses Layout besteht aus Schaltflächen und einigen anderen Ansichten - wie TextView, ImageView oder was auch immer. Jetzt möchten Sie ein anderes Ereignis ausgelöst haben, wenn Sie auf einen Klick klicken und ein anderes Ereignis ausgelöst wird.
Sie können das erreichen, ohne onListItemClick() Ihrer ListActivity zu verwenden.
Hier ist, was Sie tun müssen:
Sie verwenden benutzerdefinierte Layout, so wahrscheinlich überschreiben Sie getView() -Methode von Ihrem benutzerdefinierten Adapter. Der Trick besteht darin, die verschiedenen Listener für Ihre Schaltfläche und für die gesamte Ansicht (Ihre Zeile) unterschiedlich festzulegen. Werfen Sie einen Blick auf das Beispiel:
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 wie hier erklärt werden könnte:
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 wahrscheinlich fügen Sie einige weitere Parameter OnItemClickListener Konstruktor.
Und eine wichtige Sache - Implementierung von getView, die oben gezeigt wird, ist ziemlich hässlich, normalerweise sollten Sie das ViewHolder-Muster verwenden, um findView.ById-Aufrufe zu vermeiden .. aber Sie wissen das wahrscheinlich schon.
Meine custom_row.xml Datei ist RelativeLayout mit Button von id "button", TextView von id "text" und ImageView von id "image" - nur um Dinge klar zu stellen.
Grüße!
Ihre Lösung hinzufügen mit Nachfahre Focusability ist wirklich hilfreich, du solltest es als Antwort hinzufügen und akzeptieren! –
@Max Der Grund, warum ich nicht ist, weil es wirklich schlechte Übung ist, ein Workaround. Wenn ich jemals eine dauerhafte gesunde Lösung gefunden habe, würde ich eine Antwort geben (wenn ich mich erinnere, dass ich diese Frage vor einem Jahr geschrieben habe :)) – CodeFusionMobile
Ich möchte auch die Problemumgehung sehen, die Sie haben. Ich habe versucht, den Nachkommafokus einzustellen und kann nicht mit Tasten arbeiten. Ich habe auch versucht, eine GridView (mit ImageViews) in der Liste Zeile und ähnliche Probleme haben. – MrPurpleStreak