私はジェネリックで再利用可能なソリューションを考え出しました。具体的なリストアダプタを拡張してgetView()
メソッドを変更する代わりに、getView()
を除いて、盲目的にほとんどすべてを別のListAdapter
に転送するListAdapter
インターフェイスを実装する新しいクラスを作成しました。それは次のようになります。
public class SubClickableListAdapter implements ListAdapter {
public static interface OnSubItemClickListener {
public void onSubItemClick(View subView, int position);
}
private ListAdapter other;
private SparseArray<OnSubItemClickListener> onClickListeners;
public SubClickableListAdapter(ListAdapter other) {
this.other = other;
onClickListeners = new SparseArray<OnSubItemClickListener>();
}
public void setOnClickListener(int id, OnSubItemClickListener listener) {
onClickListeners.put(id, listener);
}
public void removeOnClickListener(int id) {
onClickListeners.remove(id);
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view = other.getView(position, convertView, parent);
for(int i = 0; i < onClickListeners.size(); i++) {
View subView = view.findViewById(onClickListeners.keyAt(i));
if (subView != null) {
final OnSubItemClickListener listener = onClickListeners.valueAt(i);
if (listener != null) {
subView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
listener.onSubItemClick(v, position);
}
});
}
}
}
return view;
}
// other implemented methods
}
他の実装方法は、単純に次のようになり:
@Override
public Object getItem(int position) {
return other.getItem(position);
}
(それArrayAdapter
またはSimpleCursorAdapter
または何か他のことだけで、他のListAdapter
を供給、それをインスタンス化し、それを使用するには)。次に、クリックをリッスンし、そのIDをid
パラメータに、リスナをlistener
パラメータに指定して、それぞれのビューに対してsetOnClickListener()
と呼び出します。クリックされた行の行IDを取得するには、ListViewのgetItemIdAtPosition(position)
メソッドを呼び出します(これはコールバックのパラメータとして与えられていないため、他の方法が必要ですが、ほとんどの場合大きな問題ではありません症例)。
このソリューションの利点は、どのようなListAdapter
でも使用できることです。したがって、アプリケーションに複数の基底ビューを使用するか、または異なるアダプタを使用する複数のListView
がある場合は、それぞれに新しいアダプタクラスを作成する必要はありません。
この問題は、他のすべてのソリューションと同じです。リスナーを登録したビューをクリックすると、ListView
のOnItemClick()
は呼び出されません。リスナーを登録していないビューについては、このコールバックが呼び出されます。たとえば、2つのテキストフィールドと1つのボタンを含むリスト項目のアクティビティがあり、ボタンのリスナーを登録した後、ボタンをクリックしてもListView
のOnItemClick()
はコールされませんが、代わりにコールバック。他の場所をクリックするとOnItemClick()
が呼び出されます。
これはうまくいきました。私はImageButtonに切り替えました。それは期待どおりには機能しませんでした。他の人には、この質問も参照してください:http://stackoverflow.com/questions/6116583/android-listview-custom-adapter-imagebutton – Henrik