[英]Updating data in FragmentStatePagerAdapter not working, getItem not called
我在使用FragmentStatePagerAdapter的片段中的viewpager中有5個片段,這5個片段具有解析為它們的日期和年份,它們需要獲取該特定日期的數據。 當我想刷新5個片段(和幻燈片選項卡)時,我重新附加了片段(帶有viewpager的片段)並更新了解析為片段的日期,選項卡的名稱更新得恰到好處,但片段卻沒有,看起來像根本不會調用FragmentStatePagerAdapter getItem()。
首先,我更新“ week”並調用重新附加片段的方法
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被調用,似乎片段是用與以前相同的解析數據“重新創建”的,我能想到的一種破解方法是只更新sharedPrefences中的日期,並且不能從getItem解析它們,但我認為這種方式更可取。
如果需要請進一步詢問,非常感謝您的幫助
您每次都會創建一個適配器,因此它不會更新數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.