1

わかった。私は 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 とそのアダプターが再作成されたときに注意する必要がある何らかの犯人はいますか? 新しいアダプターを既に開いているチャットと同期するにはどうすればよいですか?

私は多くのことを試しましたが、何もうまくいかないようです...この問題には簡単な解決策があると確信しています。

どうもありがとう。

4

2 に答える 2

0

わかりました...これは最終的に理解しました。それは私に代わって愚かなリスナーの問題でした. アクティビティが閉じられたときにチャットからリスナーを登録解除するのを忘れて、onClosed(Chat) メソッドが 2 回呼び出されました。

于 2013-07-03T12:43:44.547 に答える
0

ADT 22 以降、PagerAdapter はnotifyDataSetChanged()getCount() を呼び出す前の呼び出しについて非常に厳密になりました。したがって、解決策は、データが変更さnotifyDataSetChanged()れるたびにアダプターを呼び出すだけです。size

于 2013-06-19T08:55:25.740 に答える