5

W moim app tam 2 zaczepy (Android Projekt Wsparcie Library) jest to fragment z ViewPagerAdapter:Android ViewPager Odśwież fragment

public class ListaCanali extends Fragment { 

public static TabLayout tabLayout; 
public static ViewPager viewPager; 
public static int int_items = 2 ; 

@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View v =inflater.inflate(R.layout.lista_canali, container,false); 

    //Titolo Fragment 
    ((MainActivity) getActivity()).setActionBarTitle("Lista Canali"); 

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

    //Funzioni Tab 
    viewPager.setAdapter(new MyAdapter(getChildFragmentManager())); 
    tabLayout.post(new Runnable() { 
     @Override 
     public void run() { 
      tabLayout.setupWithViewPager(viewPager); 
     } 
    }); 

    return v; 
} 


//Adattatore Tab 
class MyAdapter extends FragmentPagerAdapter { 

    public MyAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) 
    { 
     switch (position){ 
      case 0 : return new FragmentCanali(); 
      case 1 : return new FragmentPreferiti(); 
     } 
     return null; 
    } 

    public int getCount() { 

     return int_items; 

    } 

    public CharSequence getPageTitle(int position) { 

     switch (position){ 
      case 0 : 
       return "Tutti"; 
      case 1 : 
       return "Preferiti"; 
     } 
     return null; 
    } 

Chcę moje app odświeżania fragment na Swipe i kliknij tytuł zakładki bo to don Tak się stało, mam nadzieję, że możesz mi pomóc.

+0

można sprawdzić [To przykład] (https: // github.com/CabezasGonzalezJavier/RefreshCurrentFragmentWithinViewPager) – Cabezas

Odpowiedz

5

Jestem pewien, że to nie jest tylko/najlepszy sposób to zrobić. Ale to powinno rozwiązać problem, tak jak mnie.

Proszę napisać metodę refresh() zarówno w FragmentCanali, jak i Fragment Fragment Fragmenty .

public class ListCanali extends Fragment implements OnPageChangeListener{ 
    private MyAdapter mAdapter; 

    @Override 
    public View OnCreateView (...) { 
    ... 
    if(mAdapter == null) { 
    mAdapter = new MyAdapter(getChildFragmentManager()); 
    } 
    viewPager.setAdapter(mAdapter); 
    viewPager.setOnPageChangeListener(this); 
    ... 
    } 

    ... 
    @Override 
    public void OnPageSelected (int position) { 
    switch (position){ 
      case 0 : ((FragmentCanali)adapter.getItem(position)).refresh(); 
      case 1 : ((FragmentPreferiti)adapter.getItem(position)).refresh(); 
     } 
    }} 

To będzie czystsze jeśli rozszerzyć zarówno fragmenty z fragmentu bazowej, która posiada metody abstrakcyjne odświeżania().

W onPageSelected() można po prostu zadzwonić ((BaseFragment)adapter.getItem(position)).refresh()

4

Spróbuj tego ...

aby odświeżyć fragment trzeba to pierwsza instancja.

zmiana ta

viewPager.setAdapter(new MyAdapter(getChildFragmentManager())); 

do

ArrayList<Fragment> fr_list = new ArrayList<Fragment>(); 
fr_list.add(new FragmentCanali()); 
fr_list.add(new FragmentPreferiti()); 
MyAdapter mMyAdapter = new MyAdapter(getChildFragmentManager(),fr_list); 
viewPager.setAdapter(mMyAdapter); 

W zmianie adaptera to

public MyAdapter(FragmentManager fm) { 
    super(fm); 
} 

@Override 
public Fragment getItem(int position) 
{ 
    switch (position){ 
     case 0 : return new FragmentCanali(); 
     case 1 : return new FragmentPreferiti(); 
    } 
    return null; 
} 

public int getCount() { 

    return int_items; 

} 

do

public MyAdapter(FragmentManager fm,ArrayList<Fragment> fr_list) { 
    super(fm); 
    this.fr_list=fr_list; 
} 

@Override 
public Fragment getItem(int position) 
{  
     return fr_list.get(position); 
} 

public int getCount() { 

    return fr_list.size(); 

} 

dodać refresh() metody wewnątrz fragmentów i nazwać, gdy trzeba jak poniżej

((FragmentCanali) mMyAdapter.fr_list.get(0)).refresh(); 
+0

Witam, dziękuję, ale pokazuję mi błąd ... screen: [Kliknij TUTAJ] (http://cineblog01.be/cattura.png) –

+0

Błąd w MyAdapter() ???? – uday

+0

Ok i rozwiązany, ale mam nowy błąd: [KLIKNIJ TUTAJ] (http://www.cineblog01.be/screen.png) –

3

Akceptowane odpowiedź nie jest dobra droga, dlatego dodaje rozwiązanie. po długiej walce znajdź rozwiązanie robocze.

Wystarczy powiadamiają karty, to działa niesamowite,

Reference code

void setAdapter(int position) { 
     PagerAdapter pagerAdapter = new PagerAdapter(getSupportFragmentManager()); 
     viewPager.setAdapter(pagerAdapter); 
     // when notify then set manually current position. 
     viewPager.setCurrentItem(position); 
     pagerAdapter.notifyDataSetChanged(); 
    } 

call this code when you set adapter and when you want to refresh UI.

In Your fragmentu dodać poniżej kodu do odświeżania UI

((YourActivityName) getContext()).setAdapter(selectedTabPosition); 

Użyj kontekstu rzutowania w kontekście instanceof.

Ta akcja kod tylko pomaga znaleźć rozwiązanie cel, który pracuje przy minimalnym kodu

+0

Otrzymuję wyjątek wskaźnika pustego. Czy możesz mi pomóc? – Tara

+0

w którym wierszu pojawia się błąd, czy możesz sprawdzić, czy viewpager to init, czy nie –

+0

((YourActivityName) getContext()) .setAdapter (selectedTabPosition); Używam go w fragmentach potomnych – Tara

Powiązane problemy