2012-05-12 24 views
21

Trong android, tôi thường sử dụng để tạo ra MyAdapter extends ArrayAdapter xem cho ListView, và kết quả là, tôi phải ghi đè lên các chức năngMục đích của `convertView` trong bộ điều hợp ListView là gì?

public View getView(int position, View convertView, ViewGroup parent) { 
    // somecode here 
} 

Tuy nhiên, tôi không biết chính xác những gì convertViewparent làm! Còn ai có đề nghị nào không? Thêm chi tiết, trợ giúp thêm! Cảm ơn!

Trả lời

38

Từ các tài liệu,

convertView - Quan điểm cũ để tái sử dụng, nếu có thể. Lưu ý: Bạn nên kiểm tra xem chế độ xem này là không rỗng và thuộc loại thích hợp trước khi sử dụng. Nếu không thể chuyển đổi chế độ xem này để hiển thị dữ liệu chính xác, phương pháp này có thể tạo chế độ xem mới.

Nói cách khác, thông số này được sử dụng đúng để tăng hiệu suất của Adapter. Khi một ListView sử dụng một số Adapter để điền vào các hàng của nó bằng View s, bộ điều hợp sẽ điền mỗi mục danh sách với đối tượng View bằng cách gọi getView() trên mỗi hàng. Bộ điều hợp sử dụng convertView làm cách tái chế các đối tượng cũ View không còn được sử dụng nữa. Theo cách này, ListView có thể gửi Adapter cũ, các đối tượng xem "tái chế" không còn được hiển thị thay vì khởi tạo một đối tượng hoàn toàn mới mỗi khi Adapter muốn hiển thị một mục danh sách mới. Đây là mục đích của tham số convertView.

4

convertView là bộ nhớ cache mục ListView không hiển thị và do đó nó có thể được sử dụng lại. Nó cho phép ListView không cần phải tạo ra nhiều ListItems, do đó lưu memeory và làm cho ListView trơn tru hơn.

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View view; 
    if(convertView == null) { 
     view = this.inflator.inflate(android.R.layout.simple_list_item_1, parent, false); 
    } 
    else { 
     view = convertView; 
    } 
    // remaining implementation 
    return view; 
} 
+1

Vì vậy, tôi nên sử dụng convertView nếu tôi xây dựng quan điểm của tôi mà không lạm phát một tập tin XML? –

+0

@DanChaltiel có, bạn làm – localhost

21

convertView được sử dụng để sử dụng lại chế độ xem cũ.

Hãy hiểu Adapterfunctionality trong Android. Adapter cho phép bạn sử dụng lại một số chế độ xem có dữ liệu mới. Vì vậy, nếu một danh sách có 15 mục, nhưng cửa sổ chỉ có thể hiển thị 5 mục, thì lúc đầu tiên convertView sẽ là rỗng và chúng tôi cần tạo chế độ xem mới cho năm mục này, nhưng khi bạn cuộn xuống, bạn có hai tùy chọn, tạo 6-10 lượt xem hoặc sử dụng lại chế độ xem cũ và tải dữ liệu mới vào các chế độ xem này. AdapterconvertView cho phép bạn thực hiện phương pháp sau. Version

+0

Rất hữu ích. Được mô tả bằng những từ đơn giản. – tpk

1

ngắn:

Vui lòng đọc @ Alex Lockwood và câu trả lời @ Jeet của.

trả lời của tôi:

Trước khi lý do tại sao, đó là tốt hơn/thích hợp cách sử dụng convertView trong getView()? Cũng được giải thích bởi Romain Guy trong số video này.

Một dụ,

@Override 
public View getView(final int position, View convertView, ViewGroup parent)   { 
    View rowView = convertView; 
    ViewHolder holderObject; 

if (rowView == null) { 
    rowView = inflater.inflate(R.layout.list_single_post_or_comment, parent, false); 
    holderObject = new HolderForContent(); 
    mapHolder(holderObject, rowView); 
    rowView.setTag(holderObject); 
    } else { 
    holderObject = (HolderForContent) convertView.getTag(); 
    } 
    setHolderValues(holderObject, position); 
    return rowView; 
} 

private class ViewHolder { 
    TextView mTextView; 
} 

mapHolder(holderObject, rowView) { 
    //assume R.id.mTextView exists 
    holderObject.mTextView = rowView.findViewById(R.id.mTextView); 
} 

setHolderValues(holderObject, position) { 
    //assume this arrayList exists 
    String mString = arrayList.get(position).mTextViewContent; 
    holderObject.mTextView.setText(mString); 
} 

Trên đây là chỉ là một ví dụ, bạn có thể làm theo bất kỳ loại mô hình. Nhưng nhớ này,

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 

    if (convertView == null) { 
     // todo : inflate rowView. Map view in xml. 
    } else { 
     // todo : get already defined view references 
    } 

    // todo : set data to display 

return rowView; 

} 

Bây giờ đến mục đích của convertView. lý do tại sao?

convertView được sử dụng cho tối ưu hóa hiệu suất [see biểu đồ trong trang 14 bởi Romain Guy] bằng cách không tạo lại chế độ xem đã được tạo.

Nguồn: Mọi chỉnh sửa đều được hoan nghênh. Tôi thực sự thu thập thông tin này thông qua các liên kết này,

Đọc về getView() trong nhà phát triển Android documentation.

Romain Guy nói về getView() trong video "Turbo Charge UI của bạn" tại Google IO 2009 và material được sử dụng để trình bày.

Một số tuyệt vời blog bởi Lucas Rocha.

Những người muốn tìm hiểu kỹ hơn về mã nguồn: ListView và một mẫu implementation của getView() có thể được nhìn thấy trong mã nguồn cho arrayAdapter.

Bài đăng SO tương tự.

how-do-i-choose-convertview-to-reuse

how-does-the-getview-method-work-when-creating-your-own-custom-adapter

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