更新FragmentStatePagerAdapter中的数据不起作用,不调用getItem

时间:2015-08-08 17:40:45

标签: android android-fragments android-viewpager

我使用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解析它们,但我认为这种方式更可取。

如果需要,请提出进一步的问题,并提前感谢您的帮助

1 个答案:

答案 0 :(得分:0)

您每次都在创建一个适配器,因此它不会更新数据。