Usuwanie wszystkich widoków podrzędnych z widoku

111

Jak usunąć wszystkie widoki podrzędne z widżetu? Na przykład mam GridView i dynamicznie nadymam do niego wiele innych LinearLayouts; później w mojej aplikacji chcę zacząć od nowa z tym GridView i wyczyścić wszystkie jego widoki podrzędne. Jak bym to zrobił? TIA.

Nick Betcher
źródło

Odpowiedzi:

199
viewGroup.removeAllViews()

działa dla każdej viewGroup. w twoim przypadku jest to GridView.

http://developer.android.com/reference/android/view/ViewGroup.html#removeAllViews ()

Yashwanth Kumar
źródło
5
Faktycznie removeAllViews () zgłasza wyjątek, gdy jest wywoływana w GridView. Z Dokumentów: „Ta metoda nie jest obsługiwana i wywołuje wyjątek UnsupportedOperationException”.
Moritz,
Ten komentarz dotyczy abstrakcyjnej klasy bazowej, z której pochodzi ViewGroup. Sama ViewGroup i wszystkie jej klasy pochodne obsługują removeAllViews.
Dale Wilson
Jak się dostać ViewGroup?
Nimmagadda Gowtham
@NimmagaddaGowtham większość klas XxxLayout (LinearLayout, RelativeLayout itp.) To klasy potomne klasy ViewGroup. Jeśli masz jedną z nich, masz już ViewGroup.
GrandOpener
15

Za pomocą tej funkcji można usunąć tylko niektóre typy widoków w grupie widoków :

private void clearImageView(ViewGroup v) {
    boolean doBreak = false;
    while (!doBreak) {
        int childCount = v.getChildCount();
        int i;
        for(i=0; i<childCount; i++) {
            View currentChild = v.getChildAt(i);
            // Change ImageView with your desired type view
            if (currentChild instanceof ImageView) {
                v.removeView(currentChild);
                break;
            }
        }

        if (i == childCount) {
            doBreak = true;
        }
    }
}
TienLuong
źródło
1
Głosowano w dół, ponieważ PO nie pytał, jak usunąć różne typy widoków potomnych. OP chciał usunąć wszystkie widoki podrzędne.
protectedmember
3

Spróbuj tego

RelativeLayout  relativeLayout = findViewById(R.id.realtive_layout_root);
    relativeLayout.removeAllViews();

Ten kod działa dla mnie.

Gowthaman M
źródło
0

Spróbuj tego

void removeAllChildViews(ViewGroup viewGroup) {
    for (int i = 0; i < viewGroup.getChildCount(); i++) {
        View child = viewGroup.getChildAt(i);
        if (child instanceof ViewGroup) {
            if (child instanceof AdapterView) {
                viewGroup.removeView(child);
                return;
            }
            removeAllChildViews(((ViewGroup) child));
        } else {
            viewGroup.removeView(child);
        }
    }
}
kot32go
źródło