わかった。私は Android の初心者で、ViewPager と FragmentStatePagerAdapter に問題があります。チャットが ViewPager に表示されるチャット アプリケーションがあります。チャットは動的に閉じることができ、これはアプリから移動してチャット アクティビティに戻るまで完全に機能します (アクティビティの onCreate が再度呼び出されます)。
チャット ウィンドウを 1 つ開いているとします。アクティビティを終了し、後で戻ってページを閉じようとすると、次の例外が発生します。
java.lang.IllegalStateException: The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged! Expected adapter item count: 1, found: 0
ここに私の FragmentStatePagerAdapter があります:
private class ChatPageAdapter extends FragmentStatePagerAdapter {
private Map<Integer, Fragment> pageReferenceMap = new HashMap<Integer, Fragment>();
private FragmentManager fragmentManager;
public ChatPageAdapter(FragmentManager fm) {
super(fm);
this.fragmentManager = fm;
}
public ChatFragment getItem(int position) {
Fragment fragment = ChatFragment.newInstance(Chat.getChat(position).getUniqueID());
pageReferenceMap.put(position, fragment);
return (ChatFragment) fragment;
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
public int getCount() {
return Chat.getChatCount();
}
public Object instantiateItem(ViewGroup container, int position) {
return super.instantiateItem(container, position);
}
public void destroyItem(ViewGroup container, int position, Object object) {
super.destroyItem(container, position, object);
pageReferenceMap.remove(position);
}
public ChatFragment getFragment(int position) {
return (ChatFragment) pageReferenceMap.get(position);
}
}
チャットは Chat クラスに静的に格納され、getChatCount() は単純に ArrayList のサイズを返します。私は ArrayList を 2 つの場所以外で変更していません。これらの 2 つの場所は、notifyDataSetChanged() と同期する必要があります...これは、アクティビティが再作成されるまでです。
私の open(Chat) メソッドでは、チャットがすでに「登録」されているかどうかを確認し、そうでない場合にのみ notifyDataSetChanged をトリガーします (パフォーマンスを向上させるため)。
私の close(Chat) メソッドでは、Chat クラスから Chat を削除し、アダプターで notifyDataSetChanged を呼び出すだけで、例外がスローされます。
PageViewer とそのアダプターが再作成されたときに注意する必要がある何らかの犯人はいますか? 新しいアダプターを既に開いているチャットと同期するにはどうすればよいですか?
私は多くのことを試しましたが、何もうまくいかないようです...この問題には簡単な解決策があると確信しています。
どうもありがとう。