Như Romain Guy explained a while lại 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 toàn bộ View
dữ liệu):
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 truy xuất ListView
, sau đó duyệt các chế độ xem hiện tại, so sánh mục target
bạn đang tìm với từng mục được hiển thị và nếu mục tiêu của bạn nằm trong số đó, hãy xem chế độ xem và thực hiện bộ điều hợp getView()
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ó cách nào để làm cho nó vẽ lại hàng đó mà không cần gọi listview.notifydatasetchanged()?" - Chỉ cần tìm nó như là một phần tử con của 'ViewGroup' (trong trường hợp này là' ListView') và sửa đổi nó. "Tôi đã thử gọi view.invalidate() trên khung nhìn (bên trong linearlayout) nhưng nó không vẽ lại hàng." - bạn có chắc là bạn có hàng thích hợp không? Bạn thậm chí không cần phải gọi 'invalidate()', AFAIK. – CommonsWare
Tôi chắc chắn có hàng phù hợp và chế độ xem phù hợp. Tôi nghĩ rằng vấn đề của tôi là người nghe ưu tiên của tôi đang bị thu gom rác. Tôi đã thay đổi nó vì vậy tôi gọi notifyDataSetChanged() trong onResume() của hoạt động của tôi, để giải quyết vấn đề mà tôi đang cố sửa chữa. – Falmarri