Espero poder ajudar aqui. Presumo que você tenha um layout personalizado para itens listView, e esse layout consiste em um botão e algumas outras visualizações - como TextView, ImageView ou qualquer outra. Agora você deseja ter um evento diferente disparado no clique do botão e um evento diferente disparado em todos os outros cliques.
Você pode conseguir isso sem usar onListItemClick () de sua ListActivity.
Aqui está o que você deve fazer:
Você está usando um layout personalizado, então provavelmente está substituindo o método getView () de seu adaptador personalizado. O truque é definir os ouvintes diferentes para o botão e diferentes para a exibição inteira (sua linha). Dê uma olhada no exemplo:
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");
}
}
Sua classe OnItemClickListener pode ser declarada como aqui:
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);
}
}
É claro que você provavelmente adicionará mais alguns parâmetros ao construtor OnItemClickListener.
E uma coisa importante - a implementação de getView mostrada acima é muito feia, normalmente você deve usar o padrão ViewHolder para evitar chamadas findViewById .. mas provavelmente você já sabe disso.
Meu arquivo custom_row.xml é RelativeLayout com Botão de id "botão", TextView de id "texto" e ImageView de id "imagem" - apenas para deixar as coisas claras.
Saudações!