อะไรคือความแตกต่างระหว่าง 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 () ฯลฯ วิธีการใน Adapter)
Pragnani

คำตอบ:


111

นี่คือความแตกต่าง:

  • BaseAdapterเป็นอะแดปเตอร์ทั่วไปที่ให้คุณทำอะไรก็ได้ตามต้องการ อย่างไรก็ตามคุณต้องเข้ารหัสตัวเองอีกเล็กน้อยเพื่อให้มันใช้งานได้
  • ArrayAdapterเป็นการใช้งานที่สมบูรณ์ยิ่งขึ้นซึ่งทำงานได้ดีกับข้อมูลในอาร์เรย์หรือArrayLists ในทำนองเดียวกันมีสิ่งที่เกี่ยวข้องCursorAdapterที่คุณควรใช้หากข้อมูลของคุณอยู่ในไฟล์Cursor. ทั้งสองอย่างนี้ขยายออกBaseAdapterไป

หากข้อมูลของคุณอยู่ในคอลเล็กชันเฉพาะบางประเภทหรือหากคุณไม่ต้องการลักษณะการทำงานเริ่มต้นที่ArrayAdapterมีให้คุณอาจต้องการขยายBaseAdapterเพื่อให้ได้ความยืดหยุ่นที่คุณต้องการ

ประสิทธิภาพของแต่ละอย่างขึ้นอยู่กับว่าคุณนำไปปฏิบัติหรือเปลี่ยนแปลงพฤติกรรมของพวกเขาอย่างไร หลักของพวกเขาอย่างใดอย่างหนึ่งสามารถมีประสิทธิภาพได้เช่นกัน (โดยเฉพาะเมื่อพิจารณาว่า an ArrayAdapter is a BaseAdapter)

คุณสามารถทำอะไรก็ได้ที่คุณต้องการด้วยอะแดปเตอร์ใด ๆ แต่โปรดจำไว้ว่าBaseAdapterมันเป็นนามธรรมดังนั้นคุณจึงไม่สามารถใช้งานได้โดยตรง


2
พฤติกรรมเริ่มต้นที่ArrayAdapterระบุ (ดังที่กล่าวโดย @ tanis-7x) คือสามารถมีได้เพียง 1 TextViewรายการในรายการซึ่งเป็นพฤติกรรมที่ จำกัด มาก หากมีการควบคุมหลายรายการในแต่ละรายการคุณต้องใช้BaseAdapterและกับงานด้วยตัวเอง แน่นอนว่าคุณยังสามารถใช้ได้ArrayAdapterเพราะArrayAdapterเป็นไฟล์BaseAdapter.
เฟลิกซ์

21

BaseAdapterเป็นนามธรรมในขณะที่ArrayAdapterขยายออกไปBaseAdapter(เป็นการดำเนินการที่เป็นรูปธรรมของ a BaseAdapter) หากคุณขยายเพราะArrayAdapterคุณกำลังสืบทอด ArrayAdapterคุณสมบัติทั้งหมดและลบล้างการนำไปใช้งานคุณสามารถปรับเปลี่ยนArrayAdapterลักษณะการทำงานได้ หากคุณขยาย BaseAdapterคุณต้องใช้เมธอด Abstract ทั้งหมด ArrayAdapter นั้นดำเนินการอยู่แล้ว

นอกจากนี้ยังมีผลต่อประสิทธิภาพของ ListView ด้วย

ไม่มันไม่

และคำถามสุดท้ายคือฉันสามารถทำสิ่งใด ๆ กับ ListView โดยใช้อะแดปเตอร์เหล่านี้ได้หรือไม่หรือมีบางกรณีที่สามารถใช้อะแดปเตอร์เฉพาะได้หรือไม่?

หากการใช้งานใน SDK ตอบสนองความต้องการของคุณทำไมคุณต้องลบล้างและประดิษฐ์วงล้อขึ้นมาใหม่?

ความแตกต่างที่สำคัญระหว่างพวกเขาคือBaseAdapter ไม่สามารถสร้างอินสแตนซ์ได้ในขณะที่ArrayAdapterทำได้


9

เพื่อตอบคำถาม 3 ข้อของคุณ:

(1) BaseAdapterตามเอกสาร Android เป็นเพียง superclass ArrayAdapterของจำนวนของอะแดปเตอร์ชนิดหนึ่งซึ่งเป็น มีอะแดปเตอร์อื่น ๆ จำนวนมากที่ได้มาจากBaseAdapterที่เหมาะกับวัตถุประสงค์ที่แตกต่างกัน ด้วยเหตุนี้จึงไม่ชอบจึงมีความแตกต่างในประสิทธิภาพระหว่างทั้งสอง คุณเพียงแค่สามารถเข้าถึงชุดฟังก์ชัน / วิธีการที่แตกต่างกันด้วยคลาสย่อยต่างๆ

(2) ประสิทธิภาพของคุณArrayAdapterขึ้นอยู่กับประสิทธิภาพของสิ่งที่คุณทำในคลาสนั้นเช่นการประมวลผลบิตแมปและข้อมูลอื่น ๆ

(3) คุณอาจหาวิธีทำงานListViewโดยใช้อะแดปเตอร์ประเภทอื่นได้อย่างไรก็ตามเหตุผลที่ได้ArrayAdapterผลเป็นเพราะโดยปกติแล้วมันสมเหตุสมผลเนื่องจากเป้าหมายคือการสร้างรายการแบบโต้ตอบ ArrayAdapteใช้เวลาArray, ปกติของวัตถุว่ามันแล้วกระบวนการในการสร้างข้อมูลสำรองสำหรับArrayList ListViewในแง่นั้นการตั้งค่าArrayList-> ArrayAdapter-> ListViewก็สมเหตุสมผลดี


7

ความแตกต่างอีกประการหนึ่งระหว่าง BaseAdapter และ ArrayAdapters คือถ้าคุณขยายอะแด็ปเตอร์อาร์เรย์คุณต้องเรียกตัวสร้างคลาสระดับสูงในตัวสร้างคลาสย่อย

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

}

และไม่จำเป็นต้องใช้ DataType ที่ระบุใน BaseAdapter เหมือนใน ArrayAdapter ตัวอย่าง: 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);

ที่นี่เราไม่สามารถใช้ BaseAdapter เช่น ArrayAdapter


3

BaseAdapters มีความเรียบง่ายและปรับแต่งได้มากขึ้น ArrayAdapters ใช้การใช้งานทั่วไปมากที่สุดListAdapterแต่บางครั้งก็ไม่เพียงพอ

อย่างไรก็ตามเกือบทุกอย่างสามารถทำได้โดยใช้ArrayAdapters หากรายการของคุณทำงานอยู่แล้วโดยใช้ ArrayAdapter อย่างถูกต้องคุณไม่มีอะไรจะได้รับจาก BaseAdapter

แต่ถ้าคุณได้รับการจัดเก็บของคุณContext, ArraysหรือListsในการดำเนินการของคุณ ArrayAdapter บางทีคุณอาจจะต้องการที่จะเปลี่ยนไปBaseAdapterตามที่ArrayAdapterมีอยู่แล้วให้พวกเขาดำเนินการ

อย่างไรก็ตามหากคุณทำเช่นนั้นคุณสามารถลบรายการเหล่านั้นได้ตลอดเวลาและหันมาใช้getItem()เพื่อรับรายการ Array getCount()เพื่อรับขนาดของอาร์เรย์และgetContext()เพื่อขยายมุมมองของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.