2012-10-09 41 views
6

Tôi có câu hỏi về việc có nên sử dụng Chế độ xem hoặc Phân đoạn với ViewPager hay không.Sử dụng chế độ xem hoặc phân đoạn trong ViewPager

Bối cảnh: Tôi có Hoạt động A chứa ListView. Mỗi mục ListView mở Hoạt động B. Hoạt động B hiển thị nội dung khác nhau tùy thuộc vào mục ListView nào được khai thác trong Hoạt động A. Nội dung của Hoạt động B được hiển thị bên trong một ListView.

Câu hỏi: Bây giờ, thay vì chuyển qua lại giữa Hoạt động A và B để chuyển nội dung, tôi có yêu cầu thực hiện quét ngang để chuyển nội dung trong Activity B. Một giải pháp tôi đã tìm thấy nó hoạt động) là tạo ra nhiều trường hợp của ListView của Activity B và sử dụng nó với ViewPager + PagerAdapter. Một giải pháp tiềm năng khác được tìm thấy trên tài liệu (chưa thử nó) là đưa ListView đó vào một Fragment, tạo nhiều phiên bản của đoạn và sử dụng nó với ViewPager + FragmentPagerAdapter hoặc FragmentStatePagerAdapter.

Câu hỏi của tôi là, lợi ích của việc sử dụng mỗi cách tiếp cận là gì? Tôi có nên đi qua tất cả các rắc rối của việc đưa ListView vào Fragment hoặc chỉ đơn giản là sử dụng ListView với ViewPager?

Cảm ơn

Trả lời

10

Một Fragment là một phương pháp hữu ích, tôi nghĩ rằng, khi bạn muốn để buộc một số logic kinh doanh UI với một đặc biệt View (hoặc một nhóm). Như bạn đã biết, cá nhân Fragment có các cuộc gọi lại vòng đời của chính nó và như vậy, giống như một Activity.

Thay vì có một máy chủ duy nhất Activity nhiều ListView s thông qua một đơn PagerAdapter, nó thể được sạch hơn để sử dụng cách tiếp cận FragmentFragment chỉ cần để đối phó với logic đằng sau lái đơn ListView.

Đây là tình huống rất giống với tình huống tôi vừa đối mặt. Tôi đang hiển thị các biểu mẫu cuộn dọc khác nhau (bao gồm nhiều trường nhập) trong một số ViewPager. Trong trường hợp của tôi, tôi đã đi theo phương pháp Fragment vì trong trường hợp của tôi, có thể là ViewPager thực sự sẽ cần hiển thị một loại xem hoàn toàn khác trên các trang nhất định. Ví dụ: trên một vài trang đầu tiên, biểu mẫu nhập của người dùng có thể được hiển thị. Nhưng trên trang cuối cùng, một đồ thị sẽ được hiển thị. Một bộ logic riêng biệt được yêu cầu để điều khiển biểu đồ đó. Để thúc đẩy các biểu mẫu đầu vào đó và một biểu đồ từ một đơn Activity sẽ bị lộn xộn một chút và có lẽ tôi sẽ cần phải chứa logic nghiệp vụ trong một số lớp đại biểu hoặc một thứ gì đó. Vì vậy, đối với tôi, Fragment s là sự lựa chọn hiển nhiên cuối cùng. Tôi có InputFormFragmentGraphFragment của mình và mỗi cái chỉ chứa logic áp dụng cho các số View mà chúng cung cấp.

Một điều cần lưu ý là trong tương lai gần bạn cũng có thể muốn hiển thị một loại khác nhau của View trong số ViewPager. Hoặc, bạn có thể muốn có bố cục giao diện người dùng khác hoàn toàn, có lẽ một bố cục không sử dụng ViewPager nhưng hiển thị tất cả từ bên này sang bên kia (ví dụ: bố cục được sử dụng trên máy tính bảng lớn ở chế độ ngang). Với Fragment s, mọi thứ chỉ là mô-đun nhiều hơn và bạn có thể yếu tố mã để làm điều này nhanh hơn. Mặt khác, nếu bạn đạt được mục tiêu của mình bằng cách sử dụng một đơn Activity có chứa đơn giản PagerAdapter và tất cả logic cho ListView s bên trong, bạn có thể thấy cần nhiều công việc hơn trong tương lai để hỗ trợ các loại mới của bố cục máy tính bảng đặc biệt View hoặc .

Một điều tôi sẽ nói là đã thực hiện Fragment s trong một ViewPager bản thân mình thông qua FragmentPagerAdapterFragmentStatePagerAdapter, mọi thứ có thể nhận được một chút vụng về nếu bạn có bất kỳ yêu cầu đặc biệt; quản lý Fragment s đôi khi có thể phức tạp. Ví dụ: đối với giao diện người dùng của tôi, tôi cần có thể thêm và xóa theo cách lập trình ViewPager chứa Fragment s. Tôi cũng cần đảm bảo rằng bộ điều hợp đang sử dụng không phá hủy Fragment giây khi chúng đã được hiển thị, bởi vì tôi cần thu thập dữ liệu từ tất cả đồng thời Fragment s tại một thời điểm nhất định. Hơn nữa, tôi phải gia hạn và sửa đổi FragmentPagerAdatper để đảm bảo rằng các Fragment s đi qua onDestroy() đúng cách của chúng và được xóa khỏi FragmentManager khi ViewPager bị xóa.

Fragment s cho phép một cách rất mô-đun để xây dựng giao diện người dùng cho các kích thước màn hình khác nhau và định hướng, và tuyệt vời trong cách chúng cho phép bạn đóng gói logic kinh doanh và vòng đời cho các yếu tố giao diện người dùng riêng lẻ. Tuy nhiên, nếu kịch bản của bạn thực sự đơn giản như một số ListView s trong một ViewPager và bạn biết rằng bạn sẽ không bao giờ cần mô đun, thì chi phí của Fragment s có thể là quá mức cần thiết.

+0

Về việc thu thập thông tin từ các đoạn, sẽ dễ dàng hơn khi tạo giao diện, có phân đoạn lưu trữ tham chiếu tới đối tượng triển khai và sử dụng chức năng giao diện để lưu trữ thông tin trong đối tượng đó không? –

+0

Nếu tôi hiểu đúng, tôi nghĩ những gì bạn đang gợi ý là thay vì cần phải làm những điều thông minh để đảm bảo tất cả các mảnh vỡ ở xung quanh trong ViewPager (và không liên tục bị giết và sau đó được tạo lại), thay vào đó tôi nên có một cơ chế để duy trì trạng thái của họ. Tôi có thể đã làm điều này và tôi đồng ý rằng đó là một cách tiếp cận tốt hơn, nhưng các mảnh vỡ trong ứng dụng cụ thể của tôi là khá tốn kém để xây dựng. Đối với cả hai lý do mã hóa và hiệu suất, nó đơn giản hơn để đảm bảo tất cả các Fragments ở lại xung quanh, và sau đó yêu cầu tất cả chúng đều gửi dữ liệu của chúng lại với nhau. – Trevor

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