Android 带有动态数据的FragmentStatePagerAdapter,非法状态异常
我有一个包含项目列表的主片段,单击一个项目,我会在一个新片段中打开项目的详细视图 使用 详细片段具有FragmentStatePagerAdapter以显示项目的滑动列表。一切正常,但项目的主列表在后台得到更新(AsyncTask)。在详细视图中滑动项目时,我得到 java.lang.IllegalStateException:应用程序的PagerAdapter 在未调用的情况下更改了适配器的内容 PagerAdapter#通知数据已更改!预期适配器项计数:30, 找到:40个寻呼机id 我正确地从onPostExecute()调用了adapter.notifyDataSetChanged(),但仍然无法解决此问题。我猜这个问题可能与这里分享的问题相似,但不确定。我在适配器的getItemPosition()中尝试了不同的值,但没有成功。如果能在这个问题上得到一些提示就好了。我在这里粘贴详细的片段代码以供参考Android 带有动态数据的FragmentStatePagerAdapter,非法状态异常,android,android-pageradapter,fragmentstatepageradapter,Android,Android Pageradapter,Fragmentstatepageradapter,我有一个包含项目列表的主片段,单击一个项目,我会在一个新片段中打开项目的详细视图 使用 详细片段具有FragmentStatePagerAdapter以显示项目的滑动列表。一切正常,但项目的主列表在后台得到更新(AsyncTask)。在详细视图中滑动项目时,我得到 java.lang.IllegalStateException:应用程序的PagerAdapter 在未调用的情况下更改了适配器的内容 PagerAdapter#通知数据已更改!预期适配器项计数:30, 找到:40个寻呼机id 我正确
public class FeedDetail extends Fragment {
private ViewPager mPager = null;
private PagerAdapter mPagerAdapter;
private OnFragmentInteractionListener mListener;
private FragmentActivity myContext;
public static String title;
public static Integer pos;
private LayoutInflater mInflater;
private View mRootView = null;
ViewGroup mViewGroup = null;
public static FeedDetail newInstance(String title, int pos) {
FeedDetail fragment = new FeedDetail();
Bundle args = new Bundle();
args.putString("title", title);
args.putInt("pos", pos);
fragment.setArguments(args);
return fragment;
}
public FeedDetail() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
title = getArguments().getString("title");
pos = getArguments().getInt("pos");
}
}
@Override
public void onDestroyView()
{
super.onDestroyView();
ViewGroup parentViewGroup = (ViewGroup) mRootView.getParent();
if( null != parentViewGroup ) {
parentViewGroup.removeAllViews();
}
mViewGroup.removeAllViews();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
mViewGroup = container;
if (mRootView == null) {
mRootView = (View) inflater.inflate(R.layout.feedpager, null, false);
}
else {
ViewGroup parent = (ViewGroup) mRootView.getParent();
parent.removeView(mRootView);
}
mPager = (ViewPager) mRootView.findViewById(R.id.pager);
mPagerAdapter = new ScreenSlidePagerAdapter(getChildFragmentManager());
mPager.setAdapter(mPagerAdapter);
mPager.setCurrentItem(pos);
mRootView.setFocusableInTouchMode(true);
mRootView.requestFocus();
return mRootView;
}
@Override
public void onAttach(Activity activity) {
myContext=(FragmentActivity) activity;
super.onAttach(activity);
}
@Override
public void onDetach() {
super.onDetach();
try {
Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager");
childFragmentManager.setAccessible(true);
childFragmentManager.set(this, null);
} catch (NoSuchFieldException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
public static interface OnFragmentInteractionListener {
public void onFragmentInteraction(Uri uri);
}
private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter{
public ScreenSlidePagerAdapter(FragmentManager fm) {
super(fm);
setRetainInstance(true);
}
@Override
public Fragment getItem(int position) {
return ScreenSlidePageFragment.newInstance(position);
}
@Override
public int getItemPosition(Object object) {
return 1;
}
@Override
public int getCount() {
return Navigation.adapter.getCount();
}
@Override
public CharSequence getPageTitle(int position) {
return Navigation.adapter.getFeeds().get(position).title;
}
}
}
public class FeedDetail extends Fragment {
private ViewPager mPager = null;
private PagerAdapter mPagerAdapter;
private OnFragmentInteractionListener mListener;
private FragmentActivity myContext;
public static String title;
public static Integer pos;
private LayoutInflater mInflater;
private View mRootView = null;
ViewGroup mViewGroup = null;
public static FeedDetail newInstance(String title, int pos) {
FeedDetail fragment = new FeedDetail();
Bundle args = new Bundle();
args.putString("title", title);
args.putInt("pos", pos);
fragment.setArguments(args);
return fragment;
}
public FeedDetail() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
title = getArguments().getString("title");
pos = getArguments().getInt("pos");
}
}
@Override
public void onDestroyView()
{
super.onDestroyView();
ViewGroup parentViewGroup = (ViewGroup) mRootView.getParent();
if( null != parentViewGroup ) {
parentViewGroup.removeAllViews();
}
mViewGroup.removeAllViews();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
mViewGroup = container;
if (mRootView == null) {
mRootView = (View) inflater.inflate(R.layout.feedpager, null, false);
}
else {
ViewGroup parent = (ViewGroup) mRootView.getParent();
parent.removeView(mRootView);
}
mPager = (ViewPager) mRootView.findViewById(R.id.pager);
mPagerAdapter = new ScreenSlidePagerAdapter(getChildFragmentManager());
mPager.setAdapter(mPagerAdapter);
mPager.setCurrentItem(pos);
mRootView.setFocusableInTouchMode(true);
mRootView.requestFocus();
return mRootView;
}
@Override
public void onAttach(Activity activity) {
myContext=(FragmentActivity) activity;
super.onAttach(activity);
}
@Override
public void onDetach() {
super.onDetach();
try {
Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager");
childFragmentManager.setAccessible(true);
childFragmentManager.set(this, null);
} catch (NoSuchFieldException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
public static interface OnFragmentInteractionListener {
public void onFragmentInteraction(Uri uri);
}
private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter{
public ScreenSlidePagerAdapter(FragmentManager fm) {
super(fm);
setRetainInstance(true);
}
@Override
public Fragment getItem(int position) {
return ScreenSlidePageFragment.newInstance(position);
}
@Override
public int getItemPosition(Object object) {
return 1;
}
@Override
public int getCount() {
return Navigation.adapter.getCount();
}
@Override
public CharSequence getPageTitle(int position) {
return Navigation.adapter.getFeeds().get(position).title;
}
}
}