Apa perbedaan antara BaseAdapter dan ArrayAdapter?

100

Saya ingin tahu perbedaan antara menggunakan BaseAdapterdan ArrayAdapter.

Saya telah mencapai apa yang saya inginkan ArrayAdapters.

Apakah ini mempengaruhi kinerja ListViewantarmuka adaptor yang diimplementasikan?

Dan, pertanyaan terakhir adalah, dapatkah saya melakukan sesuatu dengan ListViewmenggunakan salah satu dari ini Adapters, atau, ada kasus tertentu di mana hanya adaptor tertentu yang dapat digunakan?

Chintan Soni
sumber
2
developer.android.com/reference/android/widget/… . ArrayAdpter. developer.android.com/reference/android/widget/BaseAdapter.html . BaseAdapter. ArrayAdapter adalah sub kelas beton dari BaseAdapter
Raghunandan
5
Cukup ArrayAdapter sudah dibuat, kita hanya perlu menggunakannya. tetapi BaseAdapter adalah adaptor yang lebih umum sehingga kita perlu menyediakan implementasi. (getView (), getcount () dll. metode di Adaptor)
Pragnani

Jawaban:

111

Inilah perbedaannya:

  • BaseAdapteradalah adaptor yang sangat umum yang memungkinkan Anda melakukan apa saja yang Anda inginkan. Namun, Anda harus melakukan sedikit lebih banyak pengkodean sendiri untuk membuatnya berfungsi.
  • ArrayAdapteradalah implementasi yang lebih lengkap yang bekerja dengan baik untuk data dalam array atau ArrayLists. Demikian pula, ada terkait CursorAdapteryang harus Anda gunakan jika data Anda dalam file Cursor. Keduanya meluas BaseAdapter.

Jika data Anda berada dalam kumpulan khusus atau jika Anda tidak menginginkan perilaku default yang ArrayAdaptermenyediakan, Anda mungkin ingin memperluas BaseAdapteruntuk mendapatkan fleksibilitas yang Anda butuhkan.

Kinerja masing-masing sangat bergantung pada bagaimana Anda menerapkannya atau mengubah perilakunya. Pada intinya, salah satu bisa sama efektifnya (terutama mengingat bahwa an ArrayAdapter adalah a BaseAdapter).

Anda dapat melakukan apa pun yang Anda inginkan dengan adaptor apa pun, tetapi perlu diingat bahwa BaseAdapteritu abstrak, jadi Anda tidak dapat menggunakannya secara langsung.

Bryan Herbst
sumber
2
Perilaku default yang ArrayAdaptermenyediakan (seperti yang disebutkan oleh @ tanis-7x) adalah hanya ada 1 TextViewdi dalam item daftar, sebenarnya perilaku yang sangat terbatas. Jika ada beberapa kontrol di setiap item daftar, Anda harus menggunakan BaseAdapterdan untuk pekerjaan itu sendiri. Tentu saja Anda masih bisa menggunakan ArrayAdapter, karena ArrayAdaptermerupakan BaseAdapter.
Felix
21

BaseAdapterbersifat abstrak sementara ArrayAdaptermeluas BaseAdapter(ini adalah implementasi konkret dari a BaseAdapter). Jika Anda meluas karena ArrayAdapterAnda mewarisi semua ArrayAdapterfitur dan, menimpa penerapannya, Anda dapat mengubah ArrayAdapterperilakunya. Jika Anda memperluas, BaseAdapterAnda harus mengimplementasikan semua metode Abstrak, yang sudah diimplementasikan ArrayAdapter.

Juga, apakah itu mempengaruhi kinerja ListView

tidak.

Dan, pertanyaan terakhir adalah, dapatkah saya melakukan sesuatu dengan ListView menggunakan salah satu Adaptor ini, atau, ada kasus tertentu di mana hanya adaptor tertentu yang dapat digunakan?

Jika penerapan di SDK memenuhi kebutuhan Anda, mengapa Anda perlu menggantinya dan menciptakan kembali roda?

Perbedaan utama di antara mereka adalah bahwa BaseAdapter tidak bisa dipakai sementara ArrayAdapterbisa

Sabuk hitam
sumber
9

Menanggapi 3 pertanyaan Anda:

(1) BaseAdapter , menurut dokumen Android, hanyalah kelas super dari sejumlah jenis adaptor, salah satunya adalah ArrayAdapter. Ada sejumlah adaptor lain yang berasal dari BaseAdapteryang sesuai dengan tujuan yang berbeda. Akibatnya, tidak mungkin ada perbedaan efisiensi antara keduanya; Anda hanya mendapatkan akses ke sekumpulan fungsi / metode yang berbeda dengan berbagai subkelas.

(2) Efisiensi Anda ArrayAdapterbergantung pada efisiensi apa yang Anda lakukan di dalam kelas itu, yaitu pemrosesan bitmap dan data lainnya.

(3) Anda mungkin dapat menemukan cara untuk bekerja dengan Anda ListViewmenggunakan jenis adaptor yang berbeda, namun, alasannya ArrayAdapterberhasil adalah karena biasanya masuk akal mengingat tujuannya adalah untuk membuat daftar interaktif. Ini ArrayAdaptemengambil Array, biasanya sebuah ArrayListobjek, yang kemudian diproses untuk membuat informasi pendukung untuk ListView. Dalam hal ini, pengaturan ArrayList-> ArrayAdapter-> ListViewmasuk akal secara logis.

Rarw
sumber
7

Satu lagi perbedaan antara BaseAdapter dan ArrayAdapters adalah, jika Anda memperluas adaptor larik, Anda harus memanggil konstruktor kelas super dalam konstruktor subkelas.

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

}

Tetapi tidak ada kelas super untuk BaseAdapter. Karena BaseAdapter berfungsi sebagai kelas super untuk semua adaptor lainnya

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

}
John
sumber
Dan tidak perlu DataType Ditentukan di BaseAdapter seperti di ArrayAdapter. Contoh: ArrayAdapter <String>
Yohanes
juga Anda tidak boleh menggunakan List<T> UserList;di kelas yang meluas 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);

Di sini kita tidak dapat menggunakan BaseAdapter seperti ArrayAdapter.

Amit Yadav
sumber
3

BaseAdapterlebih minimal dan dapat disesuaikan. ArrayAdapters menerapkan penggunaan yang paling umum ListAdapter, tetapi terkadang tidak cukup.

Namun, hampir semuanya bisa dicapai dengan penggunaan ArrayAdapters. Jika daftar Anda sudah bekerja dengan menggunakan ArrayAdapter dengan benar, Anda tidak mendapatkan apa-apa dari BaseAdapter.

Namun, jika Anda menyimpan Context, Arraysatau Listsdalam implementasi ArrayAdapter, mungkin Anda ingin beralih ke BaseAdapter, seperti yang ArrayAdaptersudah diterapkan.

Bagaimanapun, jika Anda melakukan itu, Anda selalu dapat menghapus item tersebut, dan menggunakan getItem()untuk mendapatkan item Array, getCount()untuk mendapatkan ukuran array, dan getContext()untuk memekarkan pandangan Anda.

Charlie-Blake
sumber