Sự khác biệt giữa BaseAdapter và ArrayAdapter là gì?


100

Tôi muốn biết sự khác biệt giữa việc sử dụng BaseAdapterArrayAdapter.

Tôi đã đạt được những gì tôi muốn thông qua ArrayAdapters.

Nó có ảnh hưởng đến hiệu suất của ListViewgiao diện bộ điều hợp mà nó được triển khai không?

Và, câu hỏi cuối cùng là, tôi có thể làm được gì với ListViewviệc sử dụng bất kỳ cái nào trong số này không Adapters, hoặc có những trường hợp nhất định chỉ có thể sử dụng bộ điều hợp cụ thể?


2
developer.android.com/reference/android/widget/… . ArrayAdpter. developer.android.com/reference/android/widget/BaseAdapter.html . BaseAdapter. ArrayAdapter là một lớp con cụ thể của BaseAdapter
Raghunandan

5
Đơn giản là ArrayAdapter đã được xây dựng sẵn, chúng ta chỉ cần sử dụng nó. nhưng BaseAdapter là bộ điều hợp chung chung hơn mà chúng tôi cần cung cấp triển khai. (phương thức getView (), getcount (), v.v. trong Bộ điều hợp)
Pragnani

Câu trả lời:


111

Đây là sự khác biệt:

  • BaseAdapterlà một bộ điều hợp rất chung chung cho phép bạn làm bất cứ điều gì bạn muốn. Tuy nhiên, bạn phải tự viết mã nhiều hơn một chút để nó hoạt động.
  • ArrayAdapterlà một triển khai hoàn chỉnh hơn hoạt động tốt cho dữ liệu trong mảng hoặc ArrayLists. Tương tự, có một liên quan CursorAdaptermà bạn nên sử dụng nếu dữ liệu của bạn ở trong a Cursor. Cả hai đều mở rộng BaseAdapter.

Nếu dữ liệu của bạn nằm trong một bộ sưu tập chuyên biệt của một số loại hoặc nếu bạn không muốn hành vi mặc định ArrayAdaptercung cấp, bạn có thể sẽ muốn mở rộng BaseAdapterđể có được sự linh hoạt mà bạn cần.

Hiệu suất của mỗi loại thực sự phụ thuộc vào cách bạn triển khai chúng hoặc thay đổi hành vi của chúng. Về cốt lõi của chúng, một trong hai có thể hiệu quả như nhau (đặc biệt khi xem xét rằng an ArrayAdapter a BaseAdapter).

Bạn có thể làm bất cứ điều gì bạn muốn với bất kỳ bộ điều hợp nào, nhưng hãy nhớ rằng BaseAdapternó trừu tượng, vì vậy bạn không thể sử dụng trực tiếp.


2
Hành vi mặc định ArrayAdaptercung cấp (như được đề cập bởi @ tanis-7x) là chỉ có thể có 1 TextViewbên trong mục danh sách, hành vi thực sự rất hạn chế. Nếu có nhiều điều khiển trong mỗi mục danh sách, bạn phải tự mình sử dụng BaseAdaptervà thực hiện công việc. Tất nhiên bạn vẫn có thể sử dụng ArrayAdapter, bởi vì ArrayAdapterlà một BaseAdapter.
Felix

21

BaseAdapterlà trừu tượng trong khi ArrayAdaptermở rộng BaseAdapter(nó là một triển khai cụ thể của a BaseAdapter). Nếu bạn mở rộng cho ArrayAdapterbạn đang kế thừa tất cả các ArrayAdaptertính năng của và, ghi đè triển khai của nó, bạn có thể sửa đổi ArrayAdapterhành vi. Nếu bạn mở rộng, BaseAdapterbạn phải triển khai tất cả các phương thức Tóm tắt, ArrayAdapter đó đã được triển khai.

Ngoài ra, nó có ảnh hưởng đến hiệu suất của ListView không

không nó không.

Và, câu hỏi cuối cùng là, tôi có thể làm được gì với ListView bằng cách sử dụng bất kỳ Bộ điều hợp nào trong số này không, hoặc có một số trường hợp chỉ có thể sử dụng Bộ điều hợp cụ thể?

Nếu việc triển khai trong SDK đáp ứng nhu cầu của bạn, tại sao bạn cần ghi đè nó và phát minh lại bánh xe?

Sự khác biệt chính giữa chúng là BaseAdapter không thể khởi tạo trong khi ArrayAdaptercó thể


9

Đáp lại 3 câu hỏi của bạn:

(1) BaseAdapter , theo tài liệu Android, chỉ là một lớp cha của một số loại bộ điều hợp, một trong số đó là ArrayAdapter. Có một số bộ điều hợp khác có nguồn gốc từ BaseAdapterđó phù hợp với các mục đích khác nhau. Kết quả là không có bất kỳ sự khác biệt nào về hiệu quả giữa hai loại; bạn chỉ có quyền truy cập vào một tập hợp các hàm / phương thức khác với các lớp con khác nhau.

(2) Hiệu quả của bạn ArrayAdapterphụ thuộc vào hiệu quả của những gì bạn đang làm bên trong lớp đó, tức là việc xử lý bitmap và dữ liệu khác.

(3) Bạn có thể tìm ra cách hoạt động của mình ListViewbằng cách sử dụng một loại bộ điều hợp khác, tuy nhiên, lý do ArrayAdapterhoạt động là vì nó thường có ý nghĩa với mục tiêu là xây dựng một danh sách tương tác. Sau đó, ArrayAdaptelấy một Array, thường là một ArrayListtrong các đối tượng, mà nó xử lý để tạo ra thông tin hỗ trợ cho ListView. Theo nghĩa đó, việc thiết lập ArrayList-> ArrayAdapter-> ListViewchỉ hợp lý một cách hợp lý.


7

Một điểm khác biệt nữa giữa BaseAdapter và ArrayAdapters là, nếu bạn mở rộng bộ điều hợp mảng, bạn phải gọi hàm tạo siêu lớp trong hàm tạo lớp con.

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

}

Nhưng không có siêu lớp nào cho BaseAdapter. Vì BaseAdapter phục vụ như một lớp siêu cấp cho tất cả các bộ điều hợp khác

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

}

Và không cần DataType Specified trong BaseAdapter như trong ArrayAdapter. Ví dụ: ArrayAdapter <String>
John

Ngoài ra, bạn không bao giờ nên sử dụng List<T> UserList;trong lớp học kéo dài 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);

Ở đây chúng ta không thể sử dụng BaseAdapter như ArrayAdapter.


3

BaseAdapters tối giản hơn và có thể tùy chỉnh. ArrayAdapters triển khai các cách sử dụng chung nhất của ListAdapters, nhưng đôi khi chúng không đủ.

Tuy nhiên, hầu hết mọi thứ có thể đạt được bằng cách sử dụng ArrayAdapters. Nếu danh sách của bạn đã hoạt động bằng cách sử dụng ArrayAdapter một cách chính xác, bạn không có gì để đạt được từ BaseAdapter.

Tuy nhiên, nếu bạn đang lưu trữ của bạn Context, Arrayshoặc Liststrong việc thực hiện ArrayAdapter của bạn, có thể bạn sẽ muốn chuyển sang BaseAdapter, như ArrayAdapterđã có họ thực hiện.

Dù sao, nếu bạn đang làm điều đó, bạn luôn có thể xóa các mục đó và sử dụng getItem()để lấy các mục Mảng, getCount()để có kích thước của mảng và getContext()tăng chế độ xem của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.