BaseAdapter
とArrayAdapter
の使用の違いを知りたい。
私はArrayAdapters
を通して私が望むものを達成しています。
実装されているアダプタインターフェイスのListView
のパフォーマンスに影響しますか?
そして、最後の質問は、これらのListView
のいずれかを使用してAdapters
を使用して何かを達成できますか、または特定のアダプターのみを使用できる特定のケースがありますか?
違いは次のとおりです。
BaseAdapter
は、非常に汎用的なアダプターであり、ほとんど何でも実行できます。ただし、それを機能させるには、もう少しコーディングを行う必要があります。ArrayAdapter
は、配列またはArrayList
sのデータに対して適切に機能するより完全な実装です。同様に、データがCursorAdapter
にある場合に使用すべき関連Cursor
があります。これらは両方ともBaseAdapter
を拡張します。データが何らかの特殊なコレクションにある場合、またはArrayAdapter
が提供するデフォルトの動作が望ましくない場合、BaseAdapter
を拡張して必要な柔軟性を得ることができます。
それぞれのパフォーマンスは、実際にどのように実装するか、動作を変更するかによって異なります。コアでは、どちらも同じように効果的です(特に、ArrayAdapter
is a BaseAdapter
であることを考慮してください)。
任意のアダプタで何でもできますが、BaseAdapter
は抽象的であるため、直接使用することはできません。
BaseAdapter
は抽象ですが、ArrayAdapter
はBaseAdapter
を拡張します(BaseAdapter
の具体的な実装です)。 ArrayAdapter
を拡張すると、ArrayAdapter
のすべての機能を継承し、その実装をオーバーライドして、ArrayAdapter
の動作を変更できます。 BaseAdapter
を拡張する場合、ArrayAdapterがすでに実装しているすべてのAbstractメソッドを実装する必要があります。
また、ListViewのパフォーマンスに影響しますか
いいえ、違います。
そして、最後の質問は、これらのアダプタのいずれかを使用してListViewで何かを達成できますか、または特定のアダプタのみを使用できる特定のケースがありますか?
SDKの実装がニーズを満たす場合、それをオーバーライドしてホイールを再発明する必要があるのはなぜですか?
それらの主な違いは、BaseAdapter
はインスタンス化できないが、ArrayAdapter
はインスタンス化できないことです。
3つの質問への回答:
(1) BaseAdapter は、Androidのドキュメントによると、アダプタータイプのスーパークラスであり、そのうちの1つはArrayAdapter
です。 BaseAdapter
から派生した、さまざまな目的に適合するアダプターは他にも多数あります。結果として、この2つには効率性に違いがあります。さまざまなサブクラスを持つ異なる関数/メソッドのセットにアクセスするだけです。
(2)ArrayAdapter
の効率は、そのクラス内で実行していること、つまりビットマップやその他のデータの処理の効率に依存します。
(3)おそらく、異なる種類のアダプターを使用してListView
を操作する方法を見つけることができますが、ArrayAdapter
が機能する理由は、対話型リストを作成することが目標であるため、通常意味があるからです。 。 ArrayAdapte
は、Array
、通常はArrayList
のオブジェクトを取り、ListView
のバッキング情報を作成するために処理します。その意味で、ArrayList
-> ArrayAdapter
-> ListView
のセットアップは論理的に意味があります。
BaseAdapterとArrayAdaptersのもう1つの違いは、配列アダプターを拡張する場合、サブクラスコンストラクターでスーパークラスコンストラクターを呼び出す必要があることです。
UserListAdapter extends ArrayAdapter<String>{
List<String> UserList;
Context context;
public UserListAdapter(Context context, int resource,List<String> listUsers) {
super(context, resource, listUsers); /* Super class constructor is called */
UserList = listUsers;
this.context = context;
}
}
ただし、BaseAdapterにはスーパークラスはありません。 BaseAdapterは他のすべてのアダプターのスーパークラスとして機能するため
UserListAdapter extends BaseAdapter{
List<String> UserList;
Context context;
public UserListAdapter(Context context, int resource,List<String> listUsers) {
/* No super class constructor */
UserList = listUsers;
this.context = context;
}
}
private static final String[] COUNTRIES = new String[]{
"Afghanistan", "Angola", "Australia", "Bangladesh", "Belgium",
"Bhutan", "Brazil", "Canada", "China", "Denmark"
};
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, Android.R.layout.simple_dropdown_item_1line, COUNTRIES);
AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.countries_list);
textView.setAdapter(adapter);
ここでは、ArrayAdapterのようなBaseAdapterを使用できません。
BaseAdapter
sはより最小限でカスタマイズ可能です。 ArrayAdapter
sはListAdapter
sの最も一般的な使用法を実装しますが、十分ではない場合があります。
ただし、ArrayAdapter
sを使用することでほとんどすべてを実現できます。 ArrayAdapterを正しく使用してリストが既に機能している場合、BaseAdapterから得られるものは何もありません。
ただし、ArrayAdapterの実装にContext
、Arrays
、またはLists
を保存している場合は、BaseAdapter
に既にArrayAdapter
として切り替えてください。それらを実装しています。
とにかく、あなたがそれをしている場合、それらのアイテムをいつでも削除でき、getItem()
を使用して配列アイテムを取得し、getCount()
を使用して配列のサイズを取得し、getContext()
あなたの意見を膨らませます。