J'espère que je peux aider ici. Je suppose que vous avez une disposition personnalisée pour les éléments listView, et cette disposition se compose d'un bouton et de quelques autres vues - comme TextView, ImageView ou autre. Maintenant, vous voulez avoir un événement différent déclenché sur un clic sur un bouton et un événement différent déclenché sur tout le reste cliqué.
Vous pouvez y parvenir sans utiliser onListItemClick () de votre ListActivity.
Voici ce que vous devez faire:
Vous utilisez une disposition personnalisée, donc vous remplacez probablement la méthode getView () de votre adaptateur personnalisé. L'astuce consiste à définir les différents écouteurs pour votre bouton et différents pour l'ensemble de la vue (votre ligne). Jetez un œil à l'exemple:
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");
}
}
Votre classe OnItemClickListener pourrait être déclarée comme ici:
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);
}
}
Bien sûr, vous ajouterez probablement d'autres paramètres au constructeur OnItemClickListener.
Et une chose importante - l'implémentation de getView présentée ci-dessus est assez moche, normalement vous devriez utiliser le modèle ViewHolder pour éviter les appels findViewById ... mais vous le savez probablement déjà.
Mon fichier custom_row.xml est RelativeLayout avec Button de l'id "button", TextView de l'id "text" et ImageView de l'id "image" - juste pour clarifier les choses.
Cordialement!