Espero poder ayudar aquí. Supongo que tiene un diseño personalizado para los elementos de listView, y este diseño consta de un botón y algunas otras vistas, como TextView, ImageView o lo que sea. Ahora desea que se active un evento diferente al hacer clic en el botón y que se active un evento diferente en todo lo demás.
Puede lograrlo sin usar onListItemClick () de su ListActivity.
Esto es lo que tienes que hacer:
Está utilizando un diseño personalizado, por lo que probablemente esté anulando el método getView () de su adaptador personalizado. El truco consiste en establecer diferentes oyentes para su botón y diferentes para toda la vista (su fila). Mira el ejemplo:
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");
}
}
Su clase OnItemClickListener podría declararse como aquí:
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);
}
}
Por supuesto, probablemente agregará algunos parámetros más al constructor OnItemClickListener.
Y una cosa importante: la implementación de getView que se muestra arriba es bastante fea, normalmente debería usar el patrón ViewHolder para evitar llamadas a findViewById ... pero probablemente ya lo sepa.
Mi archivo custom_row.xml es RelativeLayout con Button de id "button", TextView de id "text" e ImageView de id "image" - solo para aclarar las cosas.
¡Saludos!