2016-05-14 17 views
7

Ustawiam tablayout na mój widok strony. ale gdy używam notifyDataSetChanged to usunięcie mojego CustomView i pokazano domyślny tytuł widoku mojego koduTablayout z widokiem niestandardowym Uszkodzony na wzorcu 23.4.0 lib

ViewPager viewPager = findView(R.id.view_pager); 
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager(), getResources(), getFragments()); 
    viewPager.setAdapter(adapter); 

    tabs.setupWithViewPager(viewPager); 
    for (int i = 0; i < tabs.getTabCount(); i++) { 
     TabLayout.Tab tab = tabs.getTabAt(i); 
     tab.setCustomView(getTabView(i)); 

    } 
    t.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      adapter.notifyDataSetChanged(); 
     } 
    }); 


    public View getTabView(int position) { 
    View v = LayoutInflater.from(this).inflate(R.layout.pager_tab, null); 
    RelativeLayout linearLayout = (RelativeLayout) v.findViewById(R.id.view); 



    return v; 
} 

więc jej działa prawidłowo ale gdy zgłoszę adapter.notifyDataSetChanged(); wtedy mój tablayout nie pokazuje niestandardowego widoku, który już dodałem prev. to tylko pokazuje domyślny tytuł .. Ten sam kod działa przypadku korzystania kompilacji „com.android.support:design:23.1.1”

ale jeśli mogę to zmienić do nowszej wersji to nie działa proszę może każdy Pomóż mi, próbuję tego, ale mam ans lub jakąś inną alternatywną bibliotekę lub metodę, w której mogę dodać customView w widoku tabulatora

Odpowiedz

1

Myślę, że znalazłem rodzaj rozwiązania: Posłuchaj zmiany układu, a jeśli customView ma wartość null, ustaw to znowu:

viewPager.addOnLayoutChangeListener(new ViewPager.OnLayoutChangeListener() { 
    @Override 
    public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { 
     for (int i = 0; i < tabLayout.getTabCount(); i++) { 
      if (tabLayout.getTabAt(i).getCustomView() == null) { 
       tabLayout.getTabAt(i).setCustomView(tabs[i]); 
      } 
     } 
    } 
} 
+0

ale za każdym razem, gdy dodawanie widoku jest poprawne? i poprzedni widok nie jest usuwany – andro

0

Miałem do czynienia z tym samym problemem i naprawiłem go ustawiając TabLayout.setupWithViewPager(viewPager,false) podczas instalacji (aktualnie korzystam z wersji 24.1.0).

Bardziej szczegółowe, rzetelne, wystarczy rzucić okiem na klasę TabLayout i zdać sobie sprawę, że wywołanie, które usunęło karty, pochodzi z PagerAdapterObserver. Ta wartość jest ustawiona, gdy autoRefresh jest prawdziwa, to domyślna wartość to TabLayout.setupWithViewPager(ViewPager viewPager).

Potem szybkie spojrzenie na dokumentacji powiedzieć:

Automatyczne odświeżanie Jeśli to prawda, wszelkie zmiany w PagerAdapter wywoła ten układ do ponownego zapełniania się od tytułów adaptera.

Więc albo dokumentacja powinna być aktualizowana mówiąc, że autoRefresh powinny być fałszywe dla widoku niestandardowego albo nie udało im się zająć widoków niestandardowych.

https://developer.android.com/reference/android/support/design/widget/TabLayout.html#setupWithViewPager(android.support.v4.view.ViewPager, boolean)

+0

Próbowałem ustawić go na wartość false, ale nadal otrzymuję taki sam wynik :( Problem pojawia się tylko wtedy, gdy zaktualizowałem wersję 22 do 25 – vida

1

Aby ustawić widok niestandardowy, gdy paski są tworzone lub odtworzone, potrzebujemy oddzwanianie, gdy tak się dzieje.
Klasa TabLayout nie zezwala na wywołanie detektora w tym przypadku, ale ujawnia metodę TabLayout.newTab().

Utwórz klasę, która rozciąga się od TabLayout i zastępuje newTab() w następujący sposób.

public class TabLayoutWithCustomTabView extends TabLayout { 
    public TabLayoutWithCustomTabView(Context context) { 
     super(context); 
    } 

    public TabLayoutWithCustomTabView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public TabLayoutWithCustomTabView(Context context, AttributeSet attrs, 
             int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    @NonNull 
    @Override 
    public Tab newTab() { 
     final Tab tab = super.newTab(); 
     tab.setCustomView(inflate(getContext(), R.layout.custom_layout, null)); 
     return tab; 
    } 
} 

w układzie, należy użyć nowej klasy, gdzie trzeba było TabLayout.

<com.example.TabLayoutWithCustomTabView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     ... /> 
+0

To jest fantastyczna odpowiedź. To rozwiąże problem dodawania> 1 zakładka, w której inne widoki nie ładują się. – Silmarilos

+0

to świetna, ale jak ustawić tab. title.how, aby uzyskać indeks nowej karty, abyśmy mogli ustawić tytuł – suulisin

2

Ten może być błąd! i nadal jestem w obliczu tego na najnowszej obsłudze SDK w wersji 25.2.0.

Domyślnie tablayout jest przypisany Automatyczne odświeżanie gdy viewpager jest aktualizowana.To może być stałe (Obejście) przez wyłączenie automatycznego odświeżania jak w poniższym kodzie

viewPager = (ViewPager) findViewById(R.id.viewpager); 
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); 

setupViewPager(viewPager); 
tabLayout.setupWithViewPager(viewPager,false); // Do like this to disable auto refresh of tabs 
0

Wysokość kartach jest przymocowany do 48DP. Wytyczne materiałowe używają 48dp, gdy masz tylko tekst, ale jeśli chcesz uzyskać ikonę, wysokość to 72p (Wytyczne dla kart). Więc go rozwiązać I podklasy z TabLayout i overrided onMeasure w ten sposób:

@Override protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure (widthMeasureSpec, heightMeasureSpec); super.setMeasuredDimension (widthMeasureSpec, MeasureSpec.makeMeasureSpec (MeasureSpec.getSize (heightMeasureSpec), MeasureSpec.EXACTLY)); }

Musisz także ustawić wysokość zakładki również w formacie xml.

android: layout_height = "72dp"

tak, że będzie działać dobrze.