0

我想实现带滑动标签的Google Play商店样式菜单。我密切实施tutorial,但是在我的实现中,我通过CursorLoader启动异步数据加载,我在PagerAdapter内部类的instantiateItem方法中初始化它。使用ViewPager滑动标签

问题是,PagerAdapter调用instantiateItem两次(因此实例化对应于两个选项卡的视图),它启动两次异步过程,并且每次用户单击不同的选项卡时,都会启动异步加载另外两次,造成巨大的难以控制的混乱。我怎样才能让PagerAdapter只调用一次instantiateItem?

谢谢。

编辑:这是我为我的PagerAdapter sublcass代码,实现教程:

class SamplePagerAdapter extends PagerAdapter { 

    /** 
    * @return the number of pages to display 
    */ 
    @Override 
    public int getCount() { 
     return 5; 
    } 

    /** 
    * @return true if the value returned from {@link #instantiateItem(ViewGroup, int)} is the 
    * same object as the {@link View} added to the {@link ViewPager}. 
    */ 
    @Override 
    public boolean isViewFromObject(View view, Object o) { 
     return o == view; 
    } 

    // BEGIN_INCLUDE (pageradapter_getpagetitle) 
    /** 
    * Return the title of the item at {@code position}. This is important as what this method 
    * returns is what is displayed in the {@link SlidingTabLayout}. 
    * <p> 
    * Here we construct one using the position value, but for real application the title should 
    * refer to the item's contents. 
    */ 
    @Override 
    public CharSequence getPageTitle(int position) { 
     CharSequence title = "default"; 
     switch (position) { 
      case 0: 
       title = "Happiness"; 
      break; 

      case 1: 
       title = "Intelligence"; 
      break; 

      case 2: 
       title = "Memory"; 
      break; 

      case 3: 
       title = "Personality"; 
      break; 

      case 4: 
       title = "Success & Failure"; 
      break; 
     } 

    return title; 
    } 
    // END_INCLUDE (pageradapter_getpagetitle) 

    /** 
    * Instantiate the {@link android.view.View} which should be displayed at {@code position}. Here we 
    * inflate a layout from the apps resources and then change the text view to signify the position. 
    */ 
    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
     // Inflate a new layout from our resources 
     ListView view = (ListView) getActivity().getLayoutInflater().inflate(R.layout.article_list, 
       container, false); 
     // Add the newly created View to the ViewPager 
     container.addView(view); 

     switch (position) { 
      case 0: 
       Intent intent1 = new Intent(getActivity(), ArticleService.class); 
       intent1.putExtra(ArticleService.CATEGORY_EXTRA, 1); 
       getActivity().startService(intent1); 

       getLoaderManager().initLoader(ARTICLE_LOADER, null, KnowledgeFragment.this); 
       mArticleAdapter = new ArticleAdapter(getActivity(), null, 0); 
       view.setAdapter(mArticleAdapter); 

       Log.v("PagerAdapter", "Adapter Set"); 

       Log.v("PagerAdapter", "View added"); 

       break; 
      case 1: 
       Intent intent2 = new Intent(getActivity(), ArticleService.class); 
       intent2.putExtra(ArticleService.CATEGORY_EXTRA, 2); 
       getActivity().startService(intent2); 

       getLoaderManager().initLoader(ARTICLE_LOADER, null, KnowledgeFragment.this); 
       mArticleAdapter = new ArticleAdapter(getActivity(), null, 0); 
       view.setAdapter(mArticleAdapter); 
       break; 
      case 2: 
       Intent intent3 = new Intent(getActivity(), ArticleService.class); 
       intent3.putExtra(ArticleService.CATEGORY_EXTRA, 3); 
       getActivity().startService(intent3); 

       getLoaderManager().initLoader(ARTICLE_LOADER, null, KnowledgeFragment.this); 
       mArticleAdapter = new ArticleAdapter(getActivity(), null, 0); 
       view.setAdapter(mArticleAdapter); 
       break; 
      case 3: 
       Intent intent4 = new Intent(getActivity(), ArticleService.class); 
       intent4.putExtra(ArticleService.CATEGORY_EXTRA, 4); 
       getActivity().startService(intent4); 

       getLoaderManager().initLoader(ARTICLE_LOADER, null, KnowledgeFragment.this); 
       mArticleAdapter = new ArticleAdapter(getActivity(), null, 0); 
       view.setAdapter(mArticleAdapter); 
       break; 
      case 4: 
       Intent intent5 = new Intent(getActivity(), ArticleService.class); 
       intent5.putExtra(ArticleService.CATEGORY_EXTRA, 5); 
       getActivity().startService(intent5); 

       getLoaderManager().initLoader(ARTICLE_LOADER, null, KnowledgeFragment.this); 
       mArticleAdapter = new ArticleAdapter(getActivity(), null, 0); 
       view.setAdapter(mArticleAdapter); 
       break; 
     } 

     // Return the View 
     return view; 
    } 

    /** 
    * Destroy the item from the {@link ViewPager}. In our case this is simply removing the 
    * {@link View}. 
    */ 
    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     container.removeView((View) object); 
     Log.i(LOG_TAG, "destroyItem() [position: " + position + "]"); 
    } 

} 

我知道这是PagerAdapter的默认行为,以便优化内存使用和平滑滚动两次调用该方法。本质上,我问是否有办法改变它。

+0

添加代码,您应该从您采取的示例中更改代码。 –

+0

@HarshaVardhan请参阅编辑。 – AutomEng

+0

添加您的自定义适配器类代码.. –

回答

0

我使用的getItem代替instantiateItem,见下文:

@Override 
public Fragment getItem(int position) { 
    return MyFrag.newInstance(position); 
} 

编辑:

getItem()时是在android.support.v4.app.FragmentPagerAdapter并应与片段一起使用

然后你的片段可以单独处理加载。

+0

在使用此方法时,是否必须为每个与当前选项卡对应的“页面”定义片段? – AutomEng

+0

顺便说一下,我正在检查PagerAdapter文档,并且在那里没有getItem方法。我不确定你了解我的问题。 – AutomEng

+0

对,对不起。我正在使用android.support.v4.app.FragmentPagerAdapter,它需要每个项目的一个片段。 – alenz316