Như Romain Guy explained a while back trong Google I/O session, cách hiệu quả nhất để chỉ cập nhật một cái nhìn trong một danh sách xem là một cái gì đó như sau (cái này cập nhật xem dữ liệu toàn bộ):
ListView list = getListView();
int start = list.getFirstVisiblePosition();
for(int i=start, j=list.getLastVisiblePosition();i<=j;i++)
if(target==list.getItemAtPosition(i)){
View view = list.getChildAt(i-start);
list.getAdapter().getView(i, view, list);
break;
}
Giả sử target
là một mục của bộ điều hợp.
Mã này lấy ListView
, sau đó duyệt các quan điểm hiện nay cho thấy, so sánh target
mục mà bạn đang tìm kiếm với mỗi hiển thị xem mặt hàng, và nếu mục tiêu của bạn là một trong số đó, có được cái nhìn kèm theo và thực hiện adapter getView
vào đó xem để làm mới màn hình.
Như một mặt lưu ý invalidate
không hoạt động giống như một số người mong đợi và sẽ không làm mới xem như getView không, notifyDataSetChanged
sẽ xây dựng lại toàn bộ danh sách và kết thúc gọi getview
cho mỗi mặt hàng trưng bày và invalidateViews
cũng sẽ ảnh hưởng đến một bó.
Một điều cuối cùng, bạn cũng có thể nhận được hiệu suất bổ sung nếu chỉ cần thay đổi con của chế độ xem hàng và không phải toàn bộ hàng như getView
. Trong trường hợp đó, các mã sau đây có thể thay thế list.getAdapter().getView(i, view, list);
(ví dụ để thay đổi một văn bản TextView
):
((TextView)view.findViewById(R.id.myid)).setText("some new text");
trong mã chúng tôi tin tưởng.
Cảm ơn. Điều này sẽ làm việc nếu tôi ** chỉnh sửa ** bố trí hiện tại của đứa trẻ. Nhưng nếu tôi muốn ** thay đổi bố cục hoàn toàn ** (bằng cách tăng một xml khác)? Nếu tôi gọi 'newView (...)' trên bộ điều hợp, nó mang lại cho tôi một cái nhìn khác mà tuy nhiên không được đặt trong 'listView'. – hadi
@hadi bạn nên xem câu trả lời này: http://stackoverflow.com/a/11568271/858626 –