Có một câu hỏi đơn giản sau khi tìm kiếm tôi muốn hỏi rằng tại sao chúng ta tạo lớp giữ tĩnh và gán các khung nhìn bên trong nó? Xin vui lòng rõ ràng nghi ngờ của tôi nó sẽ được giúp đỡ rất nhiều cho tôi.Lớp Chủ trong Bộ điều hợp Lớp
Trả lời
Mã của bạn có thể gọi findViewById()
thường xuyên trong khi cuộn ListView
, có thể làm chậm hiệu suất. Ngay cả khi Bộ điều hợp trả về một chế độ xem tăng cao để tái chế, bạn vẫn cần tìm kiếm các phần tử và cập nhật chúng. Cách sử dụng lặp lại findViewById()
là sử dụng mẫu thiết kế "view holder"
.
Một đối tượng ViewHolder
lưu trữ mỗi chế độ xem thành phần bên trong trường thẻ của Bố cục, để bạn có thể truy cập ngay lập tức chúng mà không cần phải tra cứu chúng nhiều lần. Đầu tiên, bạn cần phải tạo một lớp để giữ tập hợp các khung nhìn chính xác của bạn.
Bạn có thể đọc Android Guideline để biết thêm chi tiết.
- Vì vậy, khi bạn đang sử dụng "Xem chủ sở hữu", bạn có thể dễ dàng truy cập từng chế độ xem mà không cần tìm kiếm.
- có một
static inner class
cho quan điểm cải thiện đáng kể hiệu suất
bạn cũng có thể thấy liên kết Why does Android prefer static classes.
Một liên kết thú vị hơn How ListView Work, sau khi đọc nhà phát triển blog này có thể xóa logic của LisView và cũng tại sao cần triển khai lớp tĩnh bên trong cho listView.
Đó là điểm tối ưu hóa. Nếu không có một viewHolder, bạn sẽ cần phải gọi phương thức findViewById mỗi lần. với viewHolder, bạn chỉ cần gọi những thứ này một lần.
Ví dụ với một TextView và một ImageView:
Without ViewHolder:
if (convertView == null) { convertView = mInflater.inflate(..., null); } //Following called each time TextView tv = (TextView)convertView.findViewById(...); ImageView iv = (ImageView)convertView.findViewById(...); tv.setText(...)
Với ViewHolder:
if (convertView == null) { convertView = mInflater.inflate(..., null); holder = new ViewHolder(); //called once holder.tv = (TextView) vi.findViewById(..); holder.iv = (ImageView) vi.findViewById(...); vi.setTag(holder); } else { holder = (ViewHolder) vi.getTag(); } holder.tv.setText(...)
Câu trả lời cũng rất đơn giản nếu bạn hiểu cách an AdapterView
hoạt động.
An AdapterView
là chế độ xem có con được xác định bởi Adapter
. Các AdapterView
(cụ thể hơn việc triển khai cụ thể như ListView
) chứa nhiều thông tin hơn những gì được hiển thị tại bất kỳ thời điểm nào. Để tối ưu hóa mức tiêu thụ bộ nhớ và cũng vì lợi ích của hiệu suất, các Adapter
thường tái sử dụng các View
s đại diện cho các mục riêng lẻ. Vì vậy, bạn có ít số đối tượng View
hơn so với dữ liệu tương ứng.
Đối tượng được sử dụng lại có thể là phân cấp phức tạp của View
s hoặc ViewGroups
. Vì vậy, trong trường hợp bạn muốn tìm các đối tượng riêng lẻ View
từ bên trong cấu trúc phân cấp này, bạn sẽ cần phải phụ thuộc vào phương pháp findViewById()
và điều này sẽ trở nên tốn kém khi phân cấp khung nhìn có nhiều cấp. Vì vậy, để đơn giản (và cũng để cải thiện hiệu suất), mô hình Dạng xem-Người dùng được sử dụng, trong đó các đối tượng riêng lẻ mà chúng tôi quan tâm được gán cho một lớp bên trong tĩnh.
Bạn có thể tham khảo số điện thoại Android ListView and ListActivity - Tutorial của Lars Vogel để biết thêm thông tin về mẫu Người xem.
- 1. Sự khác biệt giữa mẫu bộ điều hợp đối tượng và mẫu bộ điều hợp lớp
- 2. Lớp jQuery trong bộ chọn lớp
- 3. Một phần lớp cho bộ điều khiển
- 4. "Bộ điều hợp" hoặc "bộ điều hợp"?
- 5. Xóa bộ điều khiển và lớp miền trong grails
- 6. Lớp lệnh động trong Bộ điều khiển chú thích
- 7. boost :: chủ đề trong một lớp
- 8. ASP.NET MVC: Nhóm các lớp xung quanh bộ điều khiển
- 9. std :: chủ đề của lớp
- 10. MVC - Bộ điều khiển cho lớp dịch vụ Truyền thông
- 11. Lớp chỉ mục mục không cập nhật khi thay đổi dữ liệu của bộ điều hợp
- 12. Tôi nên sử dụng tên lớp nào cho bộ điều hợp Mẫu Adaptor?
- 13. Tìm tên lớp phù hợp trong jQuery
- 14. Tiêm tài sản cho Bộ điều khiển cơ sở Lớp
- 15. Làm thế nào để kiểm tra đơn vị một lớp bộ đếm thời gian (mẫu bộ điều hợp)?
- 16. An toàn chủ đề trong lớp Java
- 17. Java: lớp xây dựng tổng hợp nội bộ riêng tư
- 18. ManagementException - Lớp không hợp lệ
- 19. Lớp khởi và đồng bộ phương pháp lớp
- 20. Bộ kết hợp "kiểu Y" hai lớp. Điều này có phổ biến không? Điều này có một tên chính thức?
- 21. Kiểm tra điều kiện tiên quyết trong Bộ điều khiển hoặc Lớp dịch vụ
- 22. JavaFX: Đang cập nhật phần UI trong một lớp điều khiển từ một chủ đề
- 23. Bộ điều hợp đồng bộ hóa liên hệ trong android
- 24. Dỡ bỏ bộ nạp lớp
- 25. bộ điều khiển, lớp thực thể hoặc dao - điều gì xảy ra ở đâu?
- 26. Làm cách nào để biết một lớp là lớp nội bộ hay lớp người dùng?
- 27. Scala: Kết hợp các lớp trường hợp
- 28. Lớp phủ hai điều khiển
- 29. Tôi có nên gửi e-mail trong lớp dịch vụ hoặc trong lớp điều khiển không?
- 30. Cách nào tốt hơn, giữ bộ điều hợp làm lớp bên trong của hoạt động hoặc bên ngoài?
xin vui lòng giúp tôi. – user1537629
Câu hỏi của bạn liên quan đến vòng loại 'tĩnh' hay ViewHolder nói chung? Bạn đã đọc tài liệu: http://developer.android.com/training/improving-layouts/smooth-scrolling.html –