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