我希望我能在这里提供帮助。我假设您有 listView 项目的自定义布局,并且此布局由按钮和其他一些视图组成 - 例如 TextView、ImageView 或其他。现在,您希望在单击按钮时触发不同的事件,并在单击其他所有内容时触发不同的事件。
您可以在不使用 ListActivity 的 onListItemClick() 的情况下实现这一点。
这是您必须做的:
您正在使用自定义布局,因此您可能正在覆盖自定义适配器中的 getView() 方法。诀窍是为您的按钮设置不同的侦听器,并为整个视图(您的行)设置不同的侦听器。看一下例子:
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");
}
}
您的 OnItemClickListener 类可以这样声明:
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);
}
}
当然,您可能会向 OnItemClickListener 构造函数添加更多参数。
还有一件重要的事情 - 上面显示的 getView 的实现非常难看,通常您应该使用 ViewHolder 模式来避免调用 findViewById .. 但您可能已经知道那个。
我的 custom_row.xml 文件是具有 id 为“button”的 Button、id 为“text”的 TextView 和 id 为“image”的 ImageView 的 RelativeLayout - 只是为了让事情更清楚。
问候!