BaseAdapterとArrayAdapterの違いは何ですか?


100

私が使用した場合の違いを知りたいBaseAdapterとしますArrayAdapter

自分のやりたいことを実現してきましたArrayAdapters

ListView実装されているアダプタインターフェイスのパフォーマンスに影響しますか?

そして最後の質問は、ListViewこれらのいずれかを使用して何かを行うことはできますかAdapters、または特定のアダプターしか使用できない特定のケースがありますか?


2
developer.android.com/reference/android/widget/…。ArrayAdpter。developer.android.com/reference/android/widget/BaseAdapter.html。BaseAdapter。ArrayAdapterはBaseAdapterの具象サブクラスである
Raghunandan

5
単にArrayAdapterがすでに構築されているので、それを使用するだけです。しかし、BaseAdapterはより一般的なアダプターであり、実装(アダプターでのgetView()、getcount()などのメソッド)を提供する必要があります
Pragnani 2013年

回答:


111

ここに違いがあります:

  • BaseAdapter非常に汎用的なアダプターで、ほとんど何でも好きなように実行できます。ただし、それを機能させるには、もう少しコーディングを行う必要があります。
  • ArrayAdapter配列またはArrayListsのデータに対して適切に機能する、より完全な実装です。同様に、CursorAdapterデータがにある場合に使用する必要がある関連がありますCursor。これらの両方が拡張されBaseAdapterます。

データが何らかの特殊なコレクションに含まれている場合、またはArrayAdapter提供されるデフォルトの動作BaseAdapterが不要な場合は、必要な柔軟性を得るために拡張することをお勧めします。

それぞれのパフォーマンスは、実際の実装方法や動作の変更方法に大きく依存します。基本的に、どちらも同じくらい効果的です(特に、ArrayAdapter がであることを考慮するBaseAdapter)。

どのアダプターでもほとんど何でもできBaseAdapterますが、それは抽象的であるため、直接使用することはできません。


2
ArrayAdapter(@ tanis-7xで言及されているように)提供するデフォルトの動作ではTextView、リストアイテム内に1つしか存在できず、実際には非常に制限された動作です。各リストアイテムに複数のコントロールがある場合は、自分で使用BaseAdapterしてジョブを実行する必要があります。もちろん、あなたはまだ使用することができますArrayAdapterので、ArrayAdapterですBaseAdapter
Felix

21

BaseAdapterArrayAdapter拡張中は抽象的ですBaseAdapter(これはの具体的な実装ですBaseAdapter)。ArrayAdapterすべてArrayAdapterのの機能を継承する ように拡張し、その実装をオーバーライドすると、ArrayAdapter動作を変更できます。拡張BaseAdapterする場合、すべてのAbstractメソッドを実装する必要があり ます。そのArrayAdapterはすでに実装しています。

また、ListViewのパフォーマンスに影響しますか

いいえ、違います。

そして最後の質問は、これらのアダプターのいずれかを使用して、ListViewで何かを行うことはできますか、または特定のアダプターしか使用できない特定のケースがありますか?

SDKの実装がニーズを満たしている場合、それをオーバーライドしてホイールを再発明する必要があるのはなぜですか?

それらの主な違いは、BaseAdapter インスタンス化できない間はインスタンス化できないArrayAdapterことです。


9

3つの質問への回答:

(1)Androidのドキュメントによると、BaseAdapterは、いくつかのアダプタタイプのスーパークラスにすぎませんArrayAdapterBaseAdapterさまざまな目的に適合する、他の多くのアダプターが派生しています。その結果、2つの間に効率の違いがあるのは不自由です。さまざまなサブクラスを持つ関数/メソッドの異なるセットにアクセスするだけです。

(2)効率は、ArrayAdapterそのクラス内で何をしているか、つまりビットマップやその他のデータの処理の効率に依存します。

(3)おそらくListView別の種類のアダプターを使用して作業する方法を考え出すことができますが、その理由ArrayAdapterは、インタラクティブなリストを作成することを目的とする場合、通常は理にかなっているためです。ArrayAdapteArray、通常ArrayListオブジェクトのを受け取り、それを処理してのバッキング情報を作成しますListView。その意味でArrayList-> ArrayAdapter-> の設定はListView論理的に理にかなっています。


7

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;
   }

}

また、ArrayAdapterのようにBaseAdapterで指定されたDataTypeは必要ありません。例:ArrayAdapter <String>
John

またList<T> UserList;、拡張するクラスでは決して使用し ないでくださいArrayAdapter<T>
Selvin

6
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は使用できません。


3

BaseAdaptersはより最小限でカスタマイズ可能です。ArrayAdapterはの最も一般的な使用法を実装してListAdapterいますが、十分でない場合もあります。

ただし、ArrayAdaptersを使用すると、ほとんどすべてのことを実現できます。ArrayAdapterを正しく使用してリストが既に機能している場合、BaseAdapterから得るものは何もありません。

ただし、を格納している場合ContextArraysまたはListsArrayAdapter実装にある場合はBaseAdapterArrayAdapterすでに実装されているので、に切り替えたい場合があります。

とにかく、そうしている場合は、いつでもそれらの項目を削除し、を使用getItem()して配列項目getCount()を取得したり、配列のサイズを取得しgetContext()たり、ビューを拡大したりできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.