What's difference between removeAllViews() and removeAllViewsInLayout()
I am populating a linear layout dynamically. Depending upon response, I have to clear the past child views and create new views. I have read the document, but still be confused with the couple methods, they all look the same function. Which function I should use.
Solution 1:
As Scott Biggs points out, the difference is not a big one. The only difference is that removeAllViews()
calls requestLayout()
and invalidate()
afterwards. The key to why this difference is here is to understand the naming of removeAllViewInLayout()
. Confusingly, its meaning isn't "remove all views within this view layout."
If we look at the similar method, removeViewInLayout(), we can understand what it's supposed to mean:
Removes a view during layout. This is useful if in your onLayout() method, you need to remove more views.
So removeAllViewsInLayout()
actually means "remove all views, and we're calling this method during a layout pass (i.e. onLayout())". That's why removeAllViewsInLayout()
doesn't call through to requestLayout()
, as it's assumed that you're already currently inside a layout pass, so requesting another layout pass is unneeded.
If you use removeAllViewsInLayout()
, then it's your responsibility to ensure that you're calling this during a layout pass, or to properly call requestLayout()
and invalidate()
as needed.
Solution 2:
removeAllViews()
: Call this method to remove all child views from the ViewGroup.
removeAllViewsInLayout()
: Called by a ViewGroup subclass to remove child views from itself, when it must first know its size on screen before it can calculate how many child views it will render.
Solution 3:
Well, looking at the source, there isn't much difference:
public void removeAllViews() {
removeAllViewsInLayout(); // Details implemented here
requestLayout();
invalidate(true);
}
So unless you want to call invalidate()
at a time of your choosing, you might as well use removeAllViews()
and save yourself a bit of typing.
EDIT
For a more detailed explanation, see David Lui's answer. To sum it up, use removeAllViews()
unless you're in the process of constructing a View--in which case you'd call removeAllViewsInLayout()
.