使用Fragment Pager Adapter时,getItem()方法被调用两次

时间:2012-10-10 16:07:30

标签: android

我正在使用片段寻呼机适配器实例化我的片段类。我能够这样做但我的问题是我的getItem()方法被调用了两次,这进一步产生了问题。你解释我为什么会发生这种情况

    package com.creatiosoft.rssfeed.adaptor;

    import android.content.Context;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentManager;
    import android.support.v4.app.FragmentPagerAdapter;
    import android.util.Log;

    import com.creatiosoft.rssfeed.utils.RssItem;
    import com.viewpagerindicator.IconPagerAdapter;

    public class NewsFeedsAdapter extends FragmentPagerAdapter implements
            IconPagerAdapter {

        int[] icon = null;
        String[] content = null;
        String[] URLs = null;
        Context cont;

        public NewsFeedsAdapter(FragmentManager fm, Context context) {
            super(fm);
            Log.i("jk", "constructor");
            this.cont = context;
            RssItem newsFeedAppliaction = (RssItem) cont;
            /*
             * Retrieving the values of the Icons and contents from the application
             * class in utils package
             */
            icon = newsFeedAppliaction.getICONS();
            content = newsFeedAppliaction.getCONTENT();
            URLs = newsFeedAppliaction.getURL();

        }

        /** instantiate a new fragment class */
        @Override
        public Fragment getItem(int position) {
            Log.i("yt", "hello" + position);
            return TestFragment.newInstance(position % content.length, cont);
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return content[position % content.length].toUpperCase();
        }

        public int getIconResId(int index) {
            return icon[index];
        }

        /** return the no of views on the basis of array items */
        @Override
        public int getCount() {

            Log.i("hi", "length" + content.length);
            return content.length;
        }
    }      

我用这段代码调用Adapter:

NewsFeedsAdapter adapter = new NewsFeedsAdapter(
                getSupportFragmentManager(), getApplicationContext());
        /**
         * get the id of the view pager declared in the xml resource and set the
         * adaptor on the view pager
         */
        ViewPager pager = (ViewPager) findViewById(R.id.pager);
        pager.setAdapter(adapter);
        //pager.setCurrentItem(0);

        /**
         * Tab page indicator class is used to indicate the tabs and is accessed
         * from the library class
         */
        TabPageIndicator indicator = (TabPageIndicator) findViewById(R.id.indicator);
        indicator.setViewPager(pager);  

3 个答案:

答案 0 :(得分:11)

请注意,寻呼机至少保留一页提前。这意味着当创建寻呼机时,他创建至少两个页面 - 他显示的页面和下一个页面,以便允许“分页”。

答案 1 :(得分:2)

在getItem方法中,您将创建一个新的片段实例。这很糟糕。它让你处于你现在的状况。你正在做的是创建一个新的annynmous项目,它会在你指定的日子里活出来。但是,当邪恶的Android系统决定需要再次与你的Fragment对话并从你的适配器请求它时,你会告诉它“不,我不想要!”而是给它一个新的片段与它的旧版本完全相同。

要解决此问题,请提前对所有片段进行充气,然后返回正确的片段。或者如果你愿意,不要。但请保留已创建实例的记录,以便返回已创建的片段。

我不确切地知道它为什么被调用两次 - 我没有搜索过v4的源代码,但可能是为了确保实际检索到该项目或系统进入需要重新引用前一项目的状态。

总之,保留创建的实例 - 特别是,对象与片段,视图和活动一样重。

class Adapter extends MyWhateverAdapter {
    Fragment[] myLovelyFragments;

    public Adapter() {
        // Instantiate your fragments and place them into myLovelyFragments
    }

    public int getFragmentCount() {
        return myLovelyFragments.length;
    }

    public Fragment getItem(int position) {
        return myLovelyFragments[position];
    }
}

答案 2 :(得分:0)

您可能遇到的问题不是方法getItem()的多次调用。经过一些研究,我发现方法isViewFromObject()有很大的作用,在文档中我们说"This method is required for a PagerAdapter to function properly."

我还发现实现该方法的正确方法是:

@Override
public boolean isViewFromObject(View view, Object object) {
    if(object != null){
        return ((Fragment)object).getView() == view;
    }else{
        return false;
    }
}

您可以查看here