6

我正在使用片段寻呼机适配器来实例化我的片段类。我可以这样做,但我的问题是我的 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;
        }
    }      

我用这段代码调用适配器:

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);  
4

3 回答 3

12

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

于 2013-10-03T07:14:43.570 回答
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];
    }
}
于 2012-10-10T16:14:50.247 回答
0

您可能遇到的问题不是方法的多次调用getItem()。经过一番研究,我发现该方法isViewFromObject()具有巨大的作用,并且在其文档中说“此方法是 PagerAdapter 正常运行所必需的”。

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

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

你可以看这里

于 2014-11-19T13:15:36.080 回答