2012-07-19 19 views
8

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

+0

xin vui lòng giúp tôi. – user1537629

+0

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 –

Trả lời

7

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.

  1. 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.
  2. 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.

1

Đó 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(...) 
    
2

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.

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