2013-08-13 9 views
33

Tôi đang triển khai ListAdapter của ExpandableListView, trong khi làm việc tôi thấy rằng tôi cần phải vượt qua hàm boolean hasStableIds(). Bất cứ ai có thể giải thích xin vui lòng ý nghĩa của id ổn định là gì? khi tôi cần cái này?Android - ý nghĩa của StableID là gì?

Trả lời

49

ID ổn định cho phép ListView để tối ưu hóa cho trường hợp các mục vẫn giữ nguyên giữa các cuộc gọi notifyDataSetChanged. Các ID mà nó đề cập đến là các ID được trả lại từ getItemId.

Nếu không có, ListView phải tạo lại tất cả View vì không thể biết ID mục có giống nhau giữa thay đổi dữ liệu hay không (ví dụ: nếu ID chỉ là chỉ mục trong dữ liệu, nó phải tạo lại mọi thứ) . Với nó, nó có thể kiềm chế tái tạo View s giữ ID mục của họ.

+3

** ví dụ: nếu ID chỉ là chỉ mục trong dữ liệu, nó phải tạo lại mọi thứ ** Không phải điều này ngược lại với sự thật? Ý tôi là, nếu id chỉ là chỉ số hơn là nó luôn ổn định vì nó sẽ không bao giờ thay đổi. Phần tử tại chỉ mục n sẽ luôn trả về một id của n và như vậy sẽ không bao giờ bị thay đổi. Và logic của tôi được hỗ trợ bởi lời giải thích được đưa ra bởi @DanyloVolokh –

+1

Đó là trường hợp bạn sử dụng hasStableIds với các chỉ mục mảng được trả về từ getItemId, vâng. Tôi thừa nhận, từ ngữ không phải là tuyệt vời. Chỉnh sửa chào mừng :) – Delyan

+0

Và chỉ để rõ ràng, theo tài liệu [tại đây] (https://developer.android.com/reference/android/widget/Adapter.html#hasStableIds()), nó sẽ trả về 'true' khi một 'id' được bảo đảm để chỉ một đối tượng duy nhất cụ thể, như là một thay đổi trong' id' biểu thị một đối tượng đã thay đổi và 'id' vẫn giữ nguyên nghĩa là nó không phải là một đối tượng mới trả về cùng một' id'. khung nhìn sẽ phải được cập nhật và phương thức sẽ được yêu cầu trả về 'false'. – Karuhanga

21

Nếu hasStableIds() trả về false thì mỗi lần bạn gọi notifyDataSetChanged() Bộ điều hợp sẽ xem giá trị trả về getItemId và cuối cùng chỉ gọi getView(int position, View convertView, ViewGroup parent) chỉ cho các mục mà id đã thay đổi.

Sử dụng kỹ thuật này bạn có thể dễ dàng cập nhật chỉ có một Item trong ListView

Nếu bạn thực hiện một cách chính xác getItemId sau đó nó có thể rất hữu ích.

Ví dụ:

Bạn có một danh sách các album:

class Album{ 
    String coverUrl; 
    String title; 
} 

Và bạn thực hiện getItemId như thế này:

@Override 
public long getItemId(int position){ 
    Album album = mListOfAlbums.get(position); 
    return (album.coverUrl + album.title).hashCode(); 
} 

Bây giờ id mục của bạn phụ thuộc vào giá trị của coverUrltiêu đề trường và nếu bạn thay đổi chúng và gọi notifyDataSetChanged() trên bộ điều hợp của bạn, sau đó bộ điều hợp sẽ gọi phương thức getItemId() của mỗi phần tử và chỉ cập nhật những mục mà id đã thay đổi.

Điều này rất hữu ích nếu bạn đang thực hiện một số thao tác "nặng" trong số getView().

+2

Tôi nghĩ, bạn có nghĩa là "Nếu hasStableIds() trả về ** true **", phải không? – Storix

+0

Không, ý tôi là "sai". Khi id không ổn định. (Mutable) –

+1

Về ví dụ của bạn, điều gì sẽ xảy ra nếu 'hashCode()' trả về cùng một số cho 2 chuỗi khác nhau (tức là bạn có xung đột mã băm)? Và khái quát hóa, nếu 'getItemId (int position)' của bạn trả về các ID duy nhất. nó ảnh hưởng như thế nào đến 'ListView'? –