我想实现带滑动标签的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的默认行为,以便优化内存使用和平滑滚动两次调用该方法。本质上,我问是否有办法改变它。
添加代码,您应该从您采取的示例中更改代码。 –
@HarshaVardhan请参阅编辑。 – AutomEng
添加您的自定义适配器类代码.. –