我想出了一個通用和可重用的解決方案。我沒有擴展具體的列表適配器並修改getView()
方法,而是創建了一個實現ListAdapter
接口的新類,它將幾乎所有內容都盲目轉發到另一個ListAdapter
,但getView()
除外。它看起來像這樣:
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);
}
要使用它,只要實現它提供任何其他ListAdapter
(無論是ArrayAdapter
或SimpleCursorAdapter
或其他任何)。然後,針對您想要在點擊中收聽的每個視圖調用setOnClickListener()
,並在id
參數中給出其ID,並在listener
參數中給出您的聽衆。要獲得被點擊的行的行ID,請調用ListView的getItemIdAtPosition(position)
方法(您必須採取其他方式,因爲它不作爲回調參數給出,但在大多數情況下這不應該是一個大問題例)。
該解決方案的優點是它可以與任何ListAdapter
一起使用。因此,如果您的應用程序有幾個ListView
,每個都使用不同的底層視圖,甚至不同的適配器,則不必爲每個適配器類創建一個新的適配器類。
問題與所有其他解決方案相同:如果您單擊註冊偵聽器的視圖,則不會調用ListView
的OnItemClick()
。對於你沒有註冊監聽器的視圖,這個回調將被調用。因此,例如,您有一個包含兩個文本字段和一個按鈕的列表項的活動,並且您爲該按鈕註冊了一個監聽器,然後單擊該按鈕將不會調用ListView
的OnItemClick()
,而是您的回調。點擊其他地方請撥打OnItemClick()
。
這工作得很好,問題是我切換到ImageButton。這並沒有如預期那樣奏效。對於其他人,也看到這個問題:http://stackoverflow.com/questions/6116583/android-listview-custom-adapter-imagebutton – Henrik 2011-12-18 17:53:55