2013-12-10 7 views
1

Я знаю, что к этой проблеме уже есть некоторые вопросы. Но я действительно новичок в Android и особенно для Fragments и Viewpager. У меня есть страсть. Я не нашел ответа, который соответствует моему коду.Как обновить фрагмент в viewpager?

Я не знаю, как обновить фрагмент или перезагрузить его, когда он снова «активен».

TabsPagerAdapter.java:

public class TabsPagerAdapter extends FragmentPagerAdapter{ 


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

    @Override 
    public Fragment getItem(int index) { 

     switch (index) { 
     case 0: 

      return new KFZFragment(); 
     case 1: 

      return new LogFragment(); 
     case 2: 

      return new TrackFragment(); 
     } 

     return null; 
    } 

    @Override 
    public int getCount() { 
     // get item count - equal to number of tabs 
     return 3; 
    } 

} 

У меня это 3 Фрагменты (KFZFragment,LogFragment,TrackFragment) и на TrackFragment рассчитать некоторые данные и эти данные должны быть дисплея в ListView в LogFragment. Но когда я перехожу в LogFragment, это не последние данные. Так оно не освежает.

Теперь как мне изменить свой код, чтобы обновить фрагменты, когда он «активен»?

MainActivityFragment.java:

public class MainActivityFragment extends FragmentActivity implements ActionBar.TabListener{ 

    private ViewPager viewPager; 
    private TabsPagerAdapter mAdapter; 
    private ActionBar actionBar; 
    List<Fragment> fragments; 

    private String[] tabs = { "KFZ", "Fahrten Log", "Kosten Track" }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main_fragment); 

     // Initilization 
     viewPager = (ViewPager) findViewById(R.id.pager); 
     actionBar = getActionBar(); 
     mAdapter = new TabsPagerAdapter(getSupportFragmentManager()); 

     fragments = new Vector<Fragment>(); 
     fragments.add(Fragment.instantiate(this, KFZFragment.class.getName(),savedInstanceState)); 
     fragments.add(Fragment.instantiate(this, LogFragment.class.getName(),savedInstanceState)); 

     viewPager.setAdapter(mAdapter); 
     actionBar.setHomeButtonEnabled(false); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);   

     // Adding Tabs 
     for (String tab_name : tabs) { 
      actionBar.addTab(actionBar.newTab().setText(tab_name) 
        .setTabListener(this)); 
     } 

     viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 

      @Override 
      public void onPageSelected(int position) { 
       // on changing the page 
       // make respected tab selected 
       actionBar.setSelectedNavigationItem(position); 

      } 

      @Override 
      public void onPageScrolled(int arg0, float arg1, int arg2) { 
      } 

      @Override 
      public void onPageScrollStateChanged(int arg0) { 
      } 
     }); 
    } 
    @Override 
    public void onTabReselected(Tab tab, FragmentTransaction ft) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     viewPager.setCurrentItem(tab.getPosition()); 

    } 

    @Override 
    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if (keyCode == KeyEvent.KEYCODE_BACK) { 


     } 
     return super.onKeyDown(keyCode, event); 
    } 

} 

Pls помочь мне.

ответ

1

В каждой из ваших KFZFragment, LogFragment и TrackFragment, вы должны быть в состоянии отменить onResume в своем классе фрагмент и поставить необходимые обновления/перезагрузки код.

0

Почему бы и нет? использовать статические методы, чтобы обновить данные

+1

Может быть опасным, если фрагмент в настоящее время не является «живым», например. во время изменения ориентации или тому подобного. – cYrixmorten

0

Я согласен с Джонатан Лин

Но если фрагмент вы хотите обновить это фрагмент, который в настоящее время, показанное вы можете сделать что-то похожее на это:

public class DisplayPagerAdapter extends FragmentPagerAdapter { 

private static final String TAG = "DisplayPagerAdapter"; 

SparseArray<DisplayFragment> registeredFragments = new SparseArray<DisplayFragment>(); 

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

@Override 
public int getCount() { 
    DisplayCoreModule display = DisplayCoreModule.getInstance(); 
    return (display != null && display.getPagesCount() > 0) ? display.getPagesCount() : 1; 
} 

@Override 
public int getItemPosition(Object object) { 
    return POSITION_NONE; 
} 


@Override 
public Fragment getItem(int position) { 
    Log.d(TAG, "getItem " + position); 
    return DisplayFragment.newInstance(position); 
} 

@Override 
public CharSequence getPageTitle(int position) { 
    DisplayCoreModule display = DisplayCoreModule.getInstance(); 
    if (display != null && display.getPagesCount() > 0) { 
     return "Side " + (position+1); 
    } else { 
     return super.getPageTitle(position); 
    } 
} 

@Override 
public Object instantiateItem(ViewGroup container, int position) { 
    Log.d(TAG, "instantiateItem " + position); 
    DisplayFragment fragment = (DisplayFragment) super.instantiateItem(container, position); 
    registeredFragments.put(position, fragment); 
    return fragment; 
} 

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

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

public SparseArray<DisplayFragment> getRegisteredFragments() { 
    return registeredFragments; 
} 

} 

Это зарегистрированная часть фрагментов, которую я хотел вам показать.

Поскольку вы используете FragmentPagerAdapter, тогда getRegisteredFragment (int position) всегда будет возвращать один из ваших фрагментов, если вы предоставите правильную позицию. Если вы в какой-то момент перейдете на FragmentStatePagerAdapter, он может вернуть значение null на некоторые позиции.

Теперь в TrackFragment создать обратный вызов к вашему MainActivity, который затем сообщает LogFragment, показанное здесь в псевдокоде:

Fragment TrackFragment { 

    interface TrackFragmentCallback() { 
     public void newInfo() 
    } 

    TrackFragmentCallback trackFragmentCallback; 

    onAttatch() { 
     // make sure to implement TrackFragmentCallback on MainActivity 
     trackFragmentCallback = (TrackFragmentCallback)getActivity(); 
    } 

    // When this fragment has new info, simply do: 
    trackFragmentCallback.newInfo(); 
} 

MainActivity implements TrackFragmentCallback { 

    newInfo() { 
     // get LogFragment 
     LogFragment logFragment = pagerAdapter.getRegisteredFragment(1); 
     if (logFragment != null) { 
      logFragment.update(); 
     } 
    } 
} 

Надеется, что это помогает.

Смежные вопросы