Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
639 views
in Technique[技术] by (71.8m points)

android - What does having BaseAdapter.hasStableIds() return true solve?

I have been trying to understand how BaseAdapter.hasStableIds() works.

From what I have read, returning true from this method helps the adapter determine if the views must be recreated or left the same. I am guessing the adapter is somehow mapping the position to an id, and if the mapping stays the same, the adapter does nothing when notifyDataSetChanged() is called.

But wouldn't this be a problem if the data has been changed while the id(and the position) remains the same? If this is indeed an issue, when exactly does returning true help?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

hasStableIds() == true means that item IDs do not change for the underlying data items, not that the data of that item never changes. E.g. the same contact has the same ID regardless where it appears in a list, but its name may change over time--user could edit it, add a nickname, etc. It's possible to imagine displaying data where each item does not have some stable ID (perhaps the data is not yours and you have no way to access a unique ID that is suitable to return from getItemId(), e.g. not compatible with the long return type).

In browsing the source code for AdapterView and AbsListView, it seems to me that this is mostly useful when you set a choice mode on a ListView/GridView, because then the view can do some more efficient management of checked item IDs and they're visual state, including across data set changes where those checked items may have moved to new positions (but they have the same ID).


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...