2013-05-28 324 views
86

Tôi muốn biết sự khác biệt giữa việc sử dụng BaseAdapterArrayAdapter.Sự khác nhau giữa BaseAdapter và ArrayAdapter là gì?

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

Điều này có ảnh hưởng đến hiệu suất của ListView trên giao 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ể thực hiện bất kỳ việc gì với ListView sử dụng bất kỳ số nào trong số này Adapters hay không.

+2

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

+4

Simple ArrayAdapter đã được xây dựng, chúng ta chỉ cần sử dụng nó. nhưng BaseAdapter là bộ điều hợp chung hơn mà chúng ta cần phải cung cấp việc thực hiện (phương thức getView(), getcount() etc trong Adapter) – Pragnani

Trả lời

96

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

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

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

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

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

+1

Hành vi mặc định mà 'ArrayAdapter' cung cấp (như đã đề cập bởi @ tanis-7x) là có thể chỉ có 1 'TextView' bên trong mục danh sách, thực sự là hành vi 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 sử dụng 'BaseAdapter' và cho công việc của chính mình. Tất nhiên bạn vẫn có thể sử dụng 'ArrayAdapter', vì' ArrayAdapter' là một 'BaseAdapter'. – Felix

3

BaseAdapter s tối thiểu và có thể tùy chỉnh hơn. ArrayAdapter s thực hiện việc sử dụng chung nhất của ListAdapter s, nhưng đôi khi chúng không đủ.

Tuy nhiên, hầu như mọi thứ đều có thể đạt được bằng cách sử dụng ArrayAdapter s. Nếu danh sách của bạn đã làm việc 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, Arrays hoặc Lists trong 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 làm như vậy, bạn luôn có thể xóa các mục đó và sử dụng getItem() để nhận các mục Array, getCount() để lấy kích thước của mảng và getContext() để tăng lượt xem.

18

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

Ngoài ra, nó ảnh hưởng đến việc thực hiện các ListView

không có nó không.

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

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 đè lên và phát minh lại bánh xe?

Sự khác biệt chính betwen họ là BaseAdapter không thể instatiate khi ArrayAdapter thể

+2

Điểm tốt .. đó là BaseAdapter Không thể được khởi tạo .. – John

8

Để đối phó với 3 câu hỏi của bạn:

(1) BaseAdapter, theo các 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ó sự khác biệt về hiệu quả giữa hai loại; bạn chỉ cần truy cập vào một tập hợp các hàm/phương thức khác nhau với các lớp con khác nhau.

(2) Hiệu quả của ArrayAdapter phụ thuộc vào hiệu quả của những gì bạn đang làm 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 để làm việc ListView bằng cách sử dụng loại bộ điều hợp khác, tuy nhiên, lý do ArrayAdapter hoạt động là vì mục đích là tạo danh sách tương tác. ArrayAdapte mất một số Array, thường là một đối tượng ArrayList, sau đó nó xử lý để tạo thông tin sao lưu cho ListView. Theo nghĩa đó, thiết lập của ArrayList ->ArrayAdapter ->ListView chỉ hợp lý có ý nghĩa.

3
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 tôi không thể sử dụng BaseAdapter như ArrayAdapter.

4

Một 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ó lớp siêu cho BaseAdapter. Vì BaseAdapter đóng vai trò siêu hạng 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; 
    } 

} 
+0

Và không cần phải có DataType được chỉ định trong BaseAdapter như trong ArrayAdapter. Ví dụ: ArrayAdapter John

+0

bạn cũng không bao giờ nên sử dụng 'List UserList;' trong lớp mở rộng 'ArrayAdapter ' – Selvin