2011-12-27 87 views
0

我創造的ListView這就需要一個繼承ListAdapterCustomAdapter)一個專門的適配器的子類。我想保留setAdaptergetAdapter方法,因爲它們是程序員期望與AdapterView一起使用的標準方法。ListView的子類自定義適配器:基本的Java Q

我可以重寫,吸氣:

@Override 
public CustomAdapter getAdapter() {...} 

因爲它仍然會返回一個ListAdapter。不過,我無法覆蓋setter:

@Override 
public void setAdapter(CustomAdapter adapter) {...} 

我得到爲什麼Java不會讓我這樣做。所以要解決它,現在,我這樣做:

@Override 
public void setAdapter(ListAdapter adapter) { 
    throw new UnsupportedOperationException("adapter must be an instance of CustomAdapter"); 
} 

public void setAdapter(CustomAdapter adapter) { 
    this.adapter = adapter; 
} 

我不認爲這是一個大問題,但它有點蟲子我。仍然暴露原始ListAdapter設置器(尤其是因爲它顯示在自動完成列表中)似乎不夠雅觀。有沒有什麼辦法可以壓制原來的setter,或者是上面的block是否做到這一點的正確方法?

感謝,

+0

我很感興趣,有什麼特別之處CustomAdapter的ListAdapter impls不能做? – user802421 2011-12-27 00:38:51

+0

自定義listView是一個向下鑽取列表,所以customAdapter需要公開在數據層次結構中向上或向下移動的方法(其中涉及到懶惰讀取數據) – noobler 2011-12-29 14:42:48

回答

2

爲什麼不

@Override 
public void setAdapter(ListAdapter adapter) { 
    if (adapter instanceof CustomAdapter) { 
     this.adapter = (CustomAdapter adapter) 
    } else { 
     throw new IllegalArgumentException("adapter must be an instance of CustomAdapter"); 
    } 
} 
+0

感謝您的答案:)但使用我的視圖的應用程序開發人員將不知道我期待一個customAdapter,直到他們得到錯誤(或閱讀我的文檔) – noobler 2011-12-27 00:26:02

+2

是的,但你的請求不利於OOP。您不能隱藏父方法,因爲有人可以將您的CustomListView分配給ListView,並且無法使用ListAdapter:'ListView lv = new CustomListView(); lv.setAdapter(new ListAdapter(...));'也許你不應該繼承子類,而是包裝ListView併爲你提供自己的接口。 – 2011-12-27 00:32:59