2011-12-27 27 views
0

私はListAdapterCustomAdapter)をサブクラスの専門アダプタを必要とリストビューのサブクラスを作成しています。 setAdaptergetAdapterメソッドは、プログラマがAdapterViewで使用する予定の標準メソッドであるため、保持したいと考えています。それはまだListAdapterを返すようListViewのサブクラス:基本的なJavaのQ

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

私はゲッターをオーバーライドすることができます。しかし、私はセッターを無効にすることはできません:

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

私はなぜこれをさせてくれないのですか?だから、今、それを回避するために、私はこれを実行します。

@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セッター(特にオートコンプリートリストに表示されているので)を公開するのは面倒です。元のセッターを抑制する方法はありますか?または上記のブロックがこれを行う正しい方法ですか?

おかげで、

+0

私はListAdapterのimplsを行うことができないことをCustomAdapter何が特別であったのかに興味がありますか? – user802421

+0

カスタムlistViewはドリルダウンリストなので、customAdapterは(データの遅延取得に関連する)データ階層内で上下に移動するメソッドを公開する必要があります。 – noobler

答えて

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

答えに感謝します:)しかし、私のビューを使用するアプリケーション開発者エラーを受け取るまで(または私のドキュメントを読む) – noobler

+2

けれども、あなたのリクエストがOOPに反するまで、私はcustomAdapterを期待しているとは思えません。親メソッドを隠すことはできません。なぜなら、誰かがあなたのCustomListViewをListViewに割り当てることができ、ListAdapterの使用に失敗するからです。 'ListView lv = new CustomListView(); lv.setAdapter(new ListAdapter(...)); 'サブクラス化はしないでくださいが、ListViewをカプセル化して、独自のインターフェイスを提供する必要があります。 –