簡體   English   中英

更新FragmentStatePagerAdapter中的數據不起作用,未調用getItem

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM