ここでお役に立てれば幸いです。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 コンストラクターにさらにいくつかのパラメーターを追加することになるでしょう。
そして、重要なことの 1 つ - 上記の getView の実装はかなり醜いです。通常は、ViewHolder パターンを使用して findViewById 呼び出しを回避する必要があります。
私のcustom_row.xmlファイルは、ID「ボタン」のボタン、ID「テキスト」のTextView、およびID「画像」のImageViewを持つRelativeLayoutです-物事を明確にするためです。
よろしく!