Tôi hy vọng tôi có thể giúp đỡ ở đây. Tôi giả sử rằng bạn có bố cục tùy chỉnh cho các mục listView và bố cục này bao gồm nút và một số chế độ xem khác - như TextView, ImageView hoặc bất cứ thứ gì. Bây giờ bạn muốn có sự kiện khác nhau được kích hoạt khi nhấp vào nút và sự kiện khác được kích hoạt trên mọi thứ khác được nhấp.
Bạn có thể đạt được điều đó mà không cần sử dụng onListItemClick () của ListActivity.
Đây là những gì bạn phải làm:
Bạn đang sử dụng bố cục tùy chỉnh, vì vậy có thể bạn đang ghi đè phương thức getView () từ bộ điều hợp tùy chỉnh của mình. Bí quyết là đặt những người nghe khác nhau cho nút của bạn và khác nhau cho toàn bộ chế độ xem (hàng của bạn). Hãy xem ví dụ:
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");
}
}
Lớp OnItemClickListener của bạn có thể được khai báo như sau:
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);
}
}
Tất nhiên, bạn có thể sẽ thêm một số tham số nữa vào hàm tạo OnItemClickListener.
Và một điều quan trọng - việc triển khai getView được hiển thị ở trên khá xấu, thông thường bạn nên sử dụng mẫu ViewHolder để tránh các cuộc gọi findViewById .. nhưng có thể bạn đã biết điều đó.
Tệp custom_row.xml của tôi là RelativeLayout với Nút của id "button", TextView của id "text" và ImageView của id "image" - chỉ để làm rõ mọi thứ.
Trân trọng!