2012-07-25 44 views
14

Tôi có một số ListFragment được hỗ trợ bởi một ArrayAdapter được điền bởi Loader. Khi người dùng nhấp vào một trong các mục, tôi muốn chuyển một tham chiếu đến mục đã chọn, cũng như phần còn lại của các mục danh sách tới một đoạn khác. Câu hỏi của tôi là làm thế nào tôi nên nhận được tất cả các mục từ bộ chuyển đổi? Dưới đây là các khả năng mà tôi nhìn thấy:Nhận tất cả các mục từ một ArrayAdapter

1. Giữ một tham chiếu đến sự ủng hộ List

Tạo adapter như vậy:

List<DomainObject> items = new ArrayList<DomainObject>(); 
listAdapter = new ArrayAdapter<DomainObject>(getActivity(), R.layout.mine, items); 

và sau đó chỉ cần vượt qua items hoặc một bản sao của nó cho hoạt động tiếp theo.

Nhược điểm tôi thấy về điều này là tôi dựa vào thực tế không có giấy tờ rằng cùng một danh sách mà tôi vượt qua để các nhà xây dựng có chứa các mục sau này.

2. Duyệt qua adapter

Khi một mục được nhấp, lặp thông qua bộ chuyển đổi và xây dựng danh sách. Điều này có vẻ như một lượng công việc không cần thiết. Các mục được chứa trong một bộ điều hợp List trong bộ điều hợp và tôi sẽ sao chép thủ công từng mục vào một danh sách mới.

3. Giữ một danh sách riêng các hạng mục khi thêm vào bộ chuyển đổi

Trước khi thêm một mục vào bộ chuyển đổi, thêm nó vào một danh sách riêng mà tôi duy trì trong đoạn. Điều này cũng lãng phí khi danh sách các mục được sao chép trong ArrayAdapter và đoạn.

Trả lời

7

Các giải pháp mà tôi đã đi với trong khi chờ đợi chỉ là không sử dụng ArrayAdapter. Trong trường hợp bạn đang chiến đấu chống lại API này, có vẻ như tốt hơn là chỉ sử dụng số ít hơn (và phức tạp) BaseAdapter. Bạn có thể đọc thêm về quyết định đi kèm với BaseAdapter thay vì ArrayAdapter trong bài viết này: Android Adapter Good Practices.

+0

Trong khi bài viết đó là chủ yếu là tốt, tôi sẽ bỏ qua toàn bộ phần an toàn chủ đề của mình. Ông hoàn toàn sai về lý do tại sao có giả sử là khóa (do lọc xảy ra trên một chủ đề nền) và rằng 'ArrayAdapter' sẽ sụp đổ nếu' notifyDataSetChanged() 'được gọi trên bất kỳ thứ gì ngoài luồng UI. –

+0

@ scompt.com Tôi nghĩ rằng liên kết bạn đã đăng là giải thích sai về ArrayAdapter. Nó dường như chỉ giải thích ArrayAdapter . Tôi hơi bối rối ... – theMfromA

+0

Từ trang bạn đã liên kết ... "Chỉ có thể hiển thị văn bản". => Sai. "Buộc bạn cung cấp danh sách các mục CharSequence ..." => Sai "Yêu cầu bạn cung cấp tài nguyên bố cục chỉ chứa TextView" => Sai. Allmost tất cả các giả định là sai ... Tôi không có nghĩa là ArrayAdapter là tốt hơn so với BaseAdapter nhưng cơ bản là sai. – Loenix

-2

Tôi nghĩ phương pháp đầu tiên là cách tốt nhất để thực hiện việc này.

Tôi không nghĩ, Dữ liệu sẽ là bản gốc cho Hoạt động khác. bởi vì, Bạn sẽ chuyển các mục qua gói, vì vậy đối tượng được viết trên bó đầu tiên và sau đó trong Hoạt động tiếp theo chúng ta đọc từ gói.

Tuy nhiên, nếu bạn đang sử dụng một số cách khác để chuyển danh sách, hãy sử dụng list.clone() để tạo đối tượng mới, thay vì chuyển đối tượng gốc.

27

Tôi hơi muộn trò chơi nhưng tôi đã gặp phải vấn đề tương tự.

Một cách để đối phó với số 1 sẽ là duy trì tham chiếu đến danh sách trong một lớp con của ArrayAdapter, để việc tái sử dụng của bạn được kiểm soát bởi đối tượng bộ điều hợp.

Cái gì như:

public class DomainAdapter extends ArrayAdapter<DomainObject> { 

    private final List<DomainObject> items; 

    public DomainAdapter(Context context, List<DomainObject> items) { 
     super(context, R.layout.mine, items); 
     this.items = items; 
    } 

    public List<DomainObject> getItems() { 
     return items; 
    } 
} 
+9

Lưu ý. Nếu bạn có kế hoạch lọc bộ điều hợp tại một số điểm, phương pháp này có khả năng thất bại. Thực hiện một bộ lọc sẽ, bên trong ArrayAdapter, tạo ra một thể hiện hoàn toàn mới của List. Điều này có nghĩa là các mục 'được định nghĩa bên ngoài 'của bạn sẽ không còn là cùng một danh sách nữa. Điều đó có nghĩa là nó sẽ không đồng bộ nếu sửa đổi sau này được thực hiện. Bạn có thể đọc thêm về nó ở đây: http://www.jaysoyer.com/2014/07/constructor-woes-androids-arrayadapter/ –

0

Kiểm tra nhanh cho biết phương thức 1 hoạt động.Nó có vẻ nhanh nhất và sạch nhất, nhưng vì nó không có giấy tờ, bạn có thể muốn kiểm tra nó trên các nền tảng dự định và bất cứ khi nào chúng cập nhật trong trường hợp cấu trúc cơ bản của các thay đổi ArrayAdapter.

Tôi đang sử dụng biên dịch SDK phiên bản 22 và phút Phiên bản SDK 10

0

Phương pháp tốt nhất là để "giữ một tham chiếu đến List" NHƯNG không đi qua "mặt hàng" biến/tham số để các vị thi công:

List<DomainObject> items = new ArrayList<DomainObject>(); listAdapter = new ArrayAdapter<DomainObject>(getActivity(), R.layout.mine);

Bằng cách này bạn chỉ khởi tạo ArrayList dưới dạng mảng trống và bạn sẽ phải tự quản lý danh sách BẠN.

Các vấn đề liên quan