I have a ListView where each row of the listview contains about 10 ImageButtons. Most of these buttons have visibility = Gone and only show up in very rare scenarios. I am wondering if it's worth it to replace these ImageButtons with ViewStubs to avoid loading them (and the images they contain) all the time for all the rows of the listview. Then again their visibility is set to "Gone", so I am not sure what impact loading them has. Do their images actually get loaded or not?
Note that I am talking about replacing e.g. the 8 ImageButtons with 8 ViewStubs, not with 1
Cheers
A ViewStub
is a dumb and lightweight
view. It has no dimension
, it does not draw anything and does not participate in the layout in any way. This means a ViewStub
is very cheap to inflate and very cheap to keep
in a view hierarchy. A ViewStub
can be best described as a lazy include
. The layout referenced by a ViewStub
is inflated and added
to the user interface only when you decide
so.
Sometimes your layout might require complex views
that are rarely used. Whether they are item details, progress indicators, or undo messages, you can reduce memory usage and speed up rendering by loading the views only when they are needed.
Simply a ViewStub
is used to increase efficiency of rendering layout. By using ViewStub
, manually views can be created but not added to view hierarchy. At the runtime, can be easily inflated, while ViewStub
is inflated, the content of the viewstub
will be replaced the defined layout in the viewstub
.
The ViewStub
will be loaded only when you actually use it/need it, i.e., when you set its visibility to VISIBLE
(actually visible) or INVISIBLE
(still not visible, but its size isn't 0 any more). ViewStub
a nice optimization
because you could have a complex layout with tons of small views or headers
anywhere, and still have your Activity load up really fast
. Once you use one of those views, it'll be loaded.
You must add ViewStub
in Layout at first, after you can inflate it to another View.
Note: One drawback of ViewStub
is that it doesn’t currently support the <merge/>
tag in the layouts to be inflated. Alos ViewStub
can’t be used more than once. Also keeping long-lived reference to a ViewStub
is unnecessary, if it is required, it's good practice to null it after inflating, so GC
can eat it.
Let's suppose your ViewStub
ID is view_stub
. You need to do the following in the activity
:
ViewStub viewStub = (ViewStub) findViewById(R.id.view_stub);
View inflatedView = viewStub.inflate();
ImageButton button = (ImageButton) inflatedView.findViewById(R.id.button);
Now you can do whatever you want with the button :) That is, the inflate method returns the stub layout which contains the actual elements from the XML file.
Of course, you can always have the onClick
XML attribute or can be dynamically called.
Is a ViewStub worth it?
->For the scenarios that you are specifying, I think `ViewStub` will be worth-shot.
See below urls about ViewStub
http://android-developers.blogspot.in/2009/03/android-layout-tricks-3-optimize-with.html
http://developer.android.com/reference/android/view/ViewStub.html
http://developer.android.com/training/improving-layouts/loading-ondemand.html
Instead of ViewStub
you can try <\include> tag
. The <include/>
will just include the xml contents in your base xml file as if the whole thing was just a single big file. It's a nice way to share layout parts between different layouts.