2015-04-12 25 views
5

Üç parçadan oluşan bir etkinliğim var. Parçalar, bir PagerAdapter kullanarak actionbar sekmelerini kullanır. Benim yapmak istediğim, aktif sekmeli parçadaki ana aktiviteden bir yönteme erişmek. Aşağıdaki kodu denedim ama bu sadece parçayı boş olarak döndürüyor, bu yüzden sekmelerde bulamıyorum!Etkinleştirme sekmeli Fragman yöntemi, etkinlikten

NPListFragment articleFrag = (NPListFragment) getSupportFragmentManager().findFragmentByTag("NP"); 
    articleFrag.refreshT(); 

PagerAdapter:

public class AppSectionsPagerAdapter extends FragmentPagerAdapter { 
public AppSectionsPagerAdapter(FragmentManager fm) { 
    super(fm); 
} 

@Override 
public Fragment getItem(int i) { 
    switch (i) { 
     case 0: 
      return new NPListFragment(); 
     case 1: 
      return new PListFragment(); 
     case 2: 
      return new FavouritesFragment(); 
    } 
    return null; 
} 

@Override 
public int getCount() { 
    return 3; 
} 

} kimse tavsiye? Bu konuda 6 saatimi harcadım, bunu çözüme kavuşturamayacağım.

+0

Eğer PagerAdapter gösterebilir Eğer onCreate yönteminde Gerekli fragmanının bir dizi yapmak gerekir Bunu çözmek için? –

+0

çağrı cihazı adaptörü ekledi - teşekkürler – user2029541

cevap

13

Yapmanız gereken: her parçayı yalnızca bir kez oluşturmak ve sonra getItem yöntemine yapılan tüm çağrılar için vermek.

Şimdi
public class AppSectionsPagerAdapter extends FragmentPagerAdapter { 

Fragment one, two, three; 

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

@Override 
public Fragment getItem(int i) { 
    switch (i) { 
     case 0: 
      if(one == null) 
       one = new NPListFragment(); 
      return one; 
     case 1: 
      if(two == null) 
       two= new PListFragment(); 
      return two; 
     case 2: 
      if(three == null) 
       three= new FavouritesFragment(); 
      return three; 
    } 
    return null; 
} 

@Override 
public int getCount() { 
    return 3; 
} 

} 

, hatta size aktivitesinde Eğer belirli bir yöntemi çağırmak istiyorsanız, tıpkı gerçek parça sınıfa döküm gerekir getItem

çağırabilirsiniz: Mesela

.

+0

güzel bir çözüm, ancak parçalara erişmeyi denediğimde, görünümlerin boş göstericisini alıyorum. Bu, yalnızca erişim görünümleri arasında bağdaştırıcıyı sıfırladıktan sonra oluyor. Herhangi bir fikir? – VinKrish

+1

Bu, başka bir boş parça oluşturacak ve görünümleri boş olacak. Önceden oluşturulmuş parçalarınızı kaydetmeniz ve bir alıcı yöntemi ile bunlara erişmeniz gerekiyor. –

2

Parçalarken, parçalarınızı kaydetmeniz ve ardından dışarıdan onlara erişmeniz gerekir.

public class AppSectionsPagerAdapter extends FragmentPagerAdapter { 
private SparseArray<Fragment> registeredFragments = new SparseArray<>(); 
public AppSectionsPagerAdapter(FragmentManager fm) { 
    super(fm); 
} 

@Override 
public Fragment getItem(int i) { 
    switch (i) { 
     case 0: 
      return new NPListFragment(); 
     case 1: 
      return new PListFragment(); 
     case 2: 
      return new FavouritesFragment(); 
    } 
    return null; 
} 

@Override 
public int getCount() { 
    return 3; 
} 

@Override 
public Object instantiateItem(ViewGroup container, int position) { 
    Fragment fragment = (Fragment) super.instantiateItem(container, position); 
    registeredFragments.put(position, fragment); 
    return fragment; 
} 

@Override 
public void destroyItem(ViewGroup container, int position, Object object) { 
    registeredFragments.remove(position); 
    super.destroyItem(container, position, object); 
} 

public Fragment getRegisteredFragment(int position) { 
    return registeredFragments.get(position); 
} 

Şimdi dışarıda

int pos = viewpager.getCurrentItem(); 
Fragment fragment = adapter.getRegisteredFragment(pos); 
switch (pos) { 
    case 0: { 
     ((NPListFragment) fragment).refreshT(); 
     break; 
    } 
    case 1: { 
     ((PListFragment) fragment).refreshK(); 
     break; 
    } 
    case 2: { 
     ((FavouritesFragment) fragment).refreshL(); 
     break; 
    } 
} 
1

gelen registeredFragments alabilirsiniz ben bu sorunu çözdü.

Oluyor, çünkü her öğe alındığında Bağdaştırıcı her başlatıldığında yeni bir Parça başlatılıyor.

Fragment[] FragmentArray; 
FragmentArray = new Fragment[] {new Fragment 1,new Fragment 2...}; // all fragment goes in array 
... 

get item(int position) 
... 
return FragmentArray[position] 
... 
Fragment1 f= (Fragment1) FragmentArray[0]; 
f.refresh() // call required function