私が使用した場合の違いを知りたいBaseAdapter
としますArrayAdapter
。
自分のやりたいことを実現してきましたArrayAdapters
。
ListView
実装されているアダプタインターフェイスのパフォーマンスに影響しますか?
そして最後の質問は、ListView
これらのいずれかを使用して何かを行うことはできますかAdapters
、または特定のアダプターしか使用できない特定のケースがありますか?
私が使用した場合の違いを知りたいBaseAdapter
としますArrayAdapter
。
自分のやりたいことを実現してきましたArrayAdapters
。
ListView
実装されているアダプタインターフェイスのパフォーマンスに影響しますか?
そして最後の質問は、ListView
これらのいずれかを使用して何かを行うことはできますかAdapters
、または特定のアダプターしか使用できない特定のケースがありますか?
回答:
ここに違いがあります:
BaseAdapter
非常に汎用的なアダプターで、ほとんど何でも好きなように実行できます。ただし、それを機能させるには、もう少しコーディングを行う必要があります。ArrayAdapter
配列またはArrayList
sのデータに対して適切に機能する、より完全な実装です。同様に、CursorAdapter
データがにある場合に使用する必要がある関連がありますCursor
。これらの両方が拡張されBaseAdapter
ます。データが何らかの特殊なコレクションに含まれている場合、またはArrayAdapter
提供されるデフォルトの動作BaseAdapter
が不要な場合は、必要な柔軟性を得るために拡張することをお勧めします。
それぞれのパフォーマンスは、実際の実装方法や動作の変更方法に大きく依存します。基本的に、どちらも同じくらい効果的です(特に、ArrayAdapter
がであることを考慮するとBaseAdapter
)。
どのアダプターでもほとんど何でもできBaseAdapter
ますが、それは抽象的であるため、直接使用することはできません。
ArrayAdapter
(@ tanis-7xで言及されているように)提供するデフォルトの動作ではTextView
、リストアイテム内に1つしか存在できず、実際には非常に制限された動作です。各リストアイテムに複数のコントロールがある場合は、自分で使用BaseAdapter
してジョブを実行する必要があります。もちろん、あなたはまだ使用することができますArrayAdapter
ので、ArrayAdapter
ですBaseAdapter
。
BaseAdapter
ArrayAdapter
拡張中は抽象的ですBaseAdapter
(これはの具体的な実装ですBaseAdapter
)。ArrayAdapter
すべてArrayAdapter
のの機能を継承する ように拡張し、その実装をオーバーライドすると、ArrayAdapter
動作を変更できます。拡張BaseAdapter
する場合、すべてのAbstractメソッドを実装する必要があり ます。そのArrayAdapterはすでに実装しています。
また、ListViewのパフォーマンスに影響しますか
いいえ、違います。
そして最後の質問は、これらのアダプターのいずれかを使用して、ListViewで何かを行うことはできますか、または特定のアダプターしか使用できない特定のケースがありますか?
SDKの実装がニーズを満たしている場合、それをオーバーライドしてホイールを再発明する必要があるのはなぜですか?
それらの主な違いは、BaseAdapter
インスタンス化できない間はインスタンス化できないArrayAdapter
ことです。
3つの質問への回答:
(1)Androidのドキュメントによると、BaseAdapterは、いくつかのアダプタタイプのスーパークラスにすぎません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;
}
}
List<T> UserList;
、拡張するクラスでは決して使用し ないでくださいArrayAdapter<T>
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
はの最も一般的な使用法を実装してListAdapter
いますが、十分でない場合もあります。
ただし、ArrayAdapter
sを使用すると、ほとんどすべてのことを実現できます。ArrayAdapterを正しく使用してリストが既に機能している場合、BaseAdapterから得るものは何もありません。
ただし、を格納している場合Context
、Arrays
またはLists
ArrayAdapter実装にある場合はBaseAdapter
、ArrayAdapter
すでに実装されているので、に切り替えたい場合があります。
とにかく、そうしている場合は、いつでもそれらの項目を削除し、を使用getItem()
して配列項目getCount()
を取得したり、配列のサイズを取得しgetContext()
たり、ビューを拡大したりできます。