Based on this answer. Thanks man.
Create your custom GridLayout widget.
package com.isolpro.pricelist.custom;
public class RearrangingGridLayout extends GridLayout {
private final List<View> views = new ArrayList<>();
public RearrangingGridLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public RearrangingGridLayout(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public RearrangingGridLayout(Context context) {
this(context, null);
}
private void arrangeElements() {
removeAllViews();
for (int i = 0; i < views.size(); i++) {
if (views.get(i).getVisibility() != GONE)
addView(views.get(i));
}
}
public void saveViews() {
for (int i = 0; i < getChildCount(); i++) {
views.add(getChildAt(i));
}
}
public void hideViewAtIndex(int index) {
if (index >= 0 && index < views.size()) {
views.get(index).setVisibility(GONE);
arrangeElements();
}
}
public void showViewAtIndex(int index) {
if (index >= 0 && index < views.size()) {
views.get(index).setVisibility(VISIBLE);
arrangeElements();
}
}
}
Here is how to use it:
Save all the children of the GridLayout after it is bound (rendered), use the following code
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
RearrangingGridLayout rglPrices = findViewById(R.id.rglPrices);
rglPrices.saveViews();
}
Now, to hide your view
rglPrices.hideViewAtIndex(indexOfView);
Similarly, to show your view
rglPrices.showViewAtIndex(indexOfView);
And you are done!
For my project, it was essential to preserve the children's position so I went with index. You can easily modify the code to work with something else like view id, by updating the show and hide functions.