web-dev-qa-db-ja.com

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

BaseAdapterArrayAdapterの使用の違いを知りたい。

私はArrayAdaptersを通して私が望むものを達成しています。

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

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

99
Chintan Soni

違いは次のとおりです。

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

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

それぞれのパフォーマンスは、実際にどのように実装するか、動作を変更するかによって異なります。コアでは、どちらも同じように効果的です(特に、ArrayAdapteris a BaseAdapterであることを考慮してください)。

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

109
Tanis.7x

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

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

いいえ、違います。

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

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

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

20
Blackbelt

3つの質問への回答:

(1) BaseAdapter は、Androidのドキュメントによると、アダプタータイプのスーパークラスであり、そのうちの1つはArrayAdapterです。 BaseAdapterから派生した、さまざまな目的に適合するアダプターは他にも多数あります。結果として、この2つには効率性に違いがあります。さまざまなサブクラスを持つ異なる関数/メソッドのセットにアクセスするだけです。

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

(3)おそらく、異なる種類のアダプターを使用してListViewを操作する方法を見つけることができますが、ArrayAdapterが機能する理由は、対話型リストを作成することが目標であるため、通常意味があるからです。 。 ArrayAdapteは、Array、通常はArrayListのオブジェクトを取り、ListViewのバッキング情報を作成するために処理します。その意味で、ArrayList-> ArrayAdapter-> ListViewのセットアップは論理的に意味があります。

9
Rarw

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

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

5
Amit Yadav

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

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

ただし、ArrayAdapterの実装にContextArrays、またはListsを保存している場合は、BaseAdapterに既にArrayAdapterとして切り替えてください。それらを実装しています。

とにかく、あなたがそれをしている場合、それらのアイテムをいつでも削除でき、getItem()を使用して配列アイテムを取得し、getCount()を使用して配列のサイズを取得し、getContext()あなたの意見を膨らませます。

3
Charlie-Blake