我使用FragmentStatePagerAdapter在一个片段内的viewpager中有5个片段,这5个片段有一个日期和一年解析它们,他们需要获取该特定日期的数据。当我想要刷新5个片段(和幻灯片标签)时,我重新附加片段(带有viewpager的片段)并更新解析为片段的日期,标签的名称更新恰到好处,但片段不要,看起来像从不调用FragmentStatePagerAdapter getItem()。
首先我更新"周"并调用一个重新附加片段的方法
switch (item.getItemId()) {
case R.id.Forrige_uge:
week = week -1;
editor.putInt("uge",week);
editor.putInt("år",year);
editor.commit();
lActivity.refreshSkemaFragment();
return true;
case R.id.Næste_uge:
week = week +1;
editor.putInt("uge",week);
editor.putInt("år",year);
editor.commit();
lActivity.refreshSkemaFragment();
return true;
default:
return super.onOptionsItemSelected(item);
}'
RefreshskemaFragment方法
protected void refreshSkemaFragment(){
Fragment frg = null;
frg = getSupportFragmentManager().findFragmentByTag("SKEMA_FRAGMENT_TAG");
final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.detach(frg);
ft.attach(frg);
ft.commit();
}
然后onCreateView中的if语句检查本周是否已有数据
if (skemaDao.idExists("Uge " + week + " - " + year)) {
//Do nothing if the table already exists, and just load the data from database
isSynced = true;
Log.v("idExists", "no sync");
} else {
//On first load start the
isSynced = false;
Log.v("idExists", "no data detected, start asynctask");
new downloadLectio().execute();
}
如果不是asynctask将被启动并且新数据将被提取并放入数据库,所有这一切都正常工作然后从asynctask调用attachTabs()更新viewpager与正确的数据,如果数据已存在它将继续使用oncreateview并使用现有数据填充viewpager
attachTabs()
public void attachTabs(){
View rootView = getActivity().getWindow().findViewById(R.id.materialTabHost).getRootView();
tabHost = (MaterialTabHost) rootView.findViewById(R.id.materialTabHost);
pager = (ViewPager) rootView.findViewById(R.id.pager);
pager.setOffscreenPageLimit(0);
// init view pager
ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager());
pager.setAdapter(adapter);
pager.getAdapter().notifyDataSetChanged();
pager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
// when user do a swipe the selected tab change
tabHost.setSelectedNavigationItem(position);
}
});
// insert all tabs from pagerAdapter data
for (int i = 0; i < adapter.getCount(); i++)
tabHost.addTab(
tabHost.newTab()
.setText(adapter.getPageTitle(i))
.setTabListener(this)
);
}
从这里调用ViewPagerAdapter
public class ViewPagerAdapter extends FragmentStatePagerAdapter {
public ViewPagerAdapter(FragmentManager fm) {
super(fm);
}
public Fragment getItem(int pos) {
Log.v("SkemaFragment current", "" + pos);
Log.v("dato passed to indhold",datoer.get(pos));
return SkemaFragmentIndhold.newInstance("" + year, datoer.get(pos));
}
@Override
public int getCount() {
return 5;
}
@Override
public CharSequence getPageTitle(int position) {
Log.v("getPageTitle", dage[position] + datoer.get(position));
String tabTitle;
tabTitle = dage[position] + "\n" + datoer.get(position);
return tabTitle;
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
}
这个问题是我永远看不到在我的日志中调用getItem,它看起来好像片段是&#34;重新创建&#34;使用与以前相同的解析数据,我能想到的一个黑客只是更新sharedPrefences中的日期而不是从getItem解析它们,但我认为这种方式更可取。
如果需要,请提出进一步的问题,并提前感谢您的帮助
答案 0 :(得分:0)
您每次都在创建一个适配器,因此它不会更新数据。