BaseAdapter ve ArrayAdapter arasındaki fark nedir?


100

Ben kullanarak arasındaki farkı bilmek istiyorum BaseAdapterve ArrayAdapter.

İstediğim şeyi başardım ArrayAdapters.

Uygulandığı ListViewadaptör arayüzünün performansını etkiliyor mu ?

Ve son soru, ListViewbunlardan herhangi birini kullanarak herhangi bir şey yapabilir miyim Adapters, yoksa sadece belirli adaptörün kullanılabildiği belirli durumlar var mı?


2
developer.android.com/reference/android/widget/… . ArrayAdpter. developer.android.com/reference/android/widget/BaseAdapter.html . BaseAdapter. ArrayAdapter, BaseAdapter'ın somut bir alt sınıfıdır
Raghunandan

5
Simply ArrayAdapter zaten oluşturulmuş, onu kullanmamız gerekiyor. ancak BaseAdapter, uygulama sağlamamız gereken daha genel bir bağdaştırıcıdır. (Adapter'de getView (), getcount () vb. yöntemler)
Pragnani

Yanıtlar:


111

İşte fark:

  • BaseAdapteristediğiniz her şeyi yapmanıza izin veren çok genel bir adaptördür. Ancak, çalışmasını sağlamak için kendiniz biraz daha fazla kodlama yapmanız gerekir.
  • ArrayAdapterdizilerdeki veya dizilerdeki veriler için iyi çalışan daha eksiksiz bir uygulamadır ArrayList. Benzer şekilde, CursorAdapterverileriniz bir Cursor. Bunların ikisi de uzar BaseAdapter.

Verileriniz özel bir koleksiyondaysa veya ArrayAdaptersağlayan varsayılan davranışı istemiyorsanız, muhtemelen BaseAdapterihtiyacınız olan esnekliği elde etmek için genişletmek isteyeceksiniz .

Her birinin performansı gerçekten onları nasıl uyguladığınıza veya davranışlarını nasıl değiştirdiğinize bağlıdır. Özünde, ya bir sadece etkili olarak (özellikle bir göz önünde olabilir ArrayAdapter olan bir BaseAdapter).

Herhangi bir adaptörle istediğinizi hemen hemen yapabilirsiniz, ancak BaseAdapterbunun soyut olduğunu unutmayın , böylece doğrudan kullanamazsınız.


2
ArrayAdapterSağlayan varsayılan davranış (@ tanis-7x tarafından belirtildiği gibi) TextViewliste öğesinin içinde yalnızca 1 olabilir , aslında çok sınırlı davranış. Her liste öğesinde birden fazla denetim varsa BaseAdapter, işi kendiniz kullanmalısınız. Tabii ki hala kullanabilirsiniz ArrayAdapter, çünkü ArrayAdapterbir BaseAdapter.
Felix

21

BaseAdaptersoyutken ArrayAdaptergenişler BaseAdapter( a'nın somut bir uygulamasıdır BaseAdapter). İçin size uzanıyorsa ArrayAdaptertüm devralan ArrayAdapterbireyin özellik ve onun uygulanmasını değiştirebileceğiniz geçersiz ArrayAdapterdavranış. Eğer uzanıyorsa BaseAdaptersen, o zaten ArrayAdapter uygular tüm Özet yöntemlerini uygular gerekir.

Ayrıca, ListView performansını etkiler mi?

hayır değil.

Ve son soru şu: ListView ile bu Adaptörlerden herhangi birini kullanarak herhangi bir şey yapabilir miyim, yoksa yalnızca belirli adaptörlerin kullanılabileceği belirli durumlar var mı?

SDK'daki uygulama ihtiyaçlarınızı karşılıyorsa neden onu geçersiz kılmalı ve tekerleği yeniden icat etmelisiniz?

Aralarındaki temel fark olmasıdır BaseAdapter iken örneğini olamaz ArrayAdapterkutu


9

3 sorunuza yanıt olarak:

(1) Android belgelerine göre BaseAdapter , biri ArrayAdapter. Bundan türetilen BaseAdapterfarklı amaçlara uyan bir dizi başka adaptör vardır . Sonuç olarak ikisi arasında verimlilik açısından herhangi bir fark olması olası değildir; çeşitli alt sınıflarla farklı işlevlere / yöntemlere erişebilirsiniz.

(2) Verimliliği, ArrayAdaptero sınıf içinde yaptığınız şeyin verimliliğine, yani bitmap'lerin ve diğer verilerin işlenmesine bağlıdır.

(3) Muhtemelen ListViewfarklı türde bir adaptör kullanarak çalışmanın bir yolunu bulabilirsin , ancak işe yaramasının nedeni ArrayAdapter, hedefin etkileşimli bir liste oluşturmak olduğu düşünüldüğünde genellikle mantıklı olmasıdır. , Daha sonra .NET Framework için destek bilgilerini oluşturmak üzere işlediği , genellikle bir nesneyi ArrayAdaptealır . Bu anlamda -> -> kurulumu mantıksal olarak mantıklıdır.ArrayArrayListListViewArrayListArrayAdapterListView


7

BaseAdapter ve ArrayAdapters arasındaki bir başka fark, dizi bağdaştırıcısını genişletirseniz, alt sınıf yapıcısında süper sınıf yapıcısını çağırmanız gerektiğidir.

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

}

Ancak BaseAdapter için süper sınıf yoktur. BaseAdapter diğer tüm adaptörler için süper sınıf görevi gördüğünden

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

}

Ve ArrayAdapter'daki gibi BaseAdapter'da Belirtilen DataType'a gerek yoktur. Örnek: ArrayAdapter <String>
John

ayrıca List<T> UserList;uzatan sınıfta asla kullanmamalısınızArrayAdapter<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);

Burada BaseAdapter'ı ArrayAdapter gibi kullanamayız.


3

BaseAdapterdaha minimal ve özelleştirilebilir. ArrayAdapters'nin en genel kullanımlarını uygular ListAdapter, ancak bazen yeterli olmazlar.

Bununla birlikte, hemen hemen her şey ArrayAdapters kullanılarak sağlanabilir . Listeleriniz ArrayAdapter kullanarak zaten çalışıyorsa, BaseAdapter'dan elde edecek hiçbir şeyiniz yoktur.

Ancak, senin depolamak eğer Context, Arraysya Listsda ArrayAdapter uygulanmasında, belki geçmek isteyeceksiniz BaseAdapterolarak, ArrayAdapterzaten onları hayata sahiptir.

Her neyse, bunu yapıyorsanız, bu öğeleri her zaman kaldırabilir ve getItem()Array öğelerini getCount()almak, dizinin boyutunu elde etmek ve getContext()görünümlerinizi büyütmek için kullanmaya başvurabilirsiniz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.