2011-12-27 89 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