20

FragmentPagerAdapterへの変更について通知する必要があるいくつかのフラグメントを含むを使用しdatabaseます。これを行うには、コールバック インターフェイスを実装するフラグメントを繰り返し処理し、refreshData()メソッドを呼び出します。

これは、デバイスの向きが変わるまで問題なく機能します。向きを変更した後、メソッド呼び出しが機能しているように見えても、フラグメント UI が視覚的に更新されません。

私がこれまでに読んだことから、これFragmentPagerAdapterはフラグメントのライフサイクルを処理し、コールバックを受け取るフラグメントが実際に表示されるものではないために発生します。

private class DataPagerAdapter extends FragmentPagerAdapter {

    private DataFragment[] fragments = new DataFragment[] {
                                     new FooDataFragment(), BarDataFragment()};

    public DataPagerAdapter(android.support.v4.app.FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        return fragments[position];
    }

    @Override
    public int getCount() {
        return fragments.length;
    }

    public DataFragment[] getFragments() {
        return fragments;
    }
}

protected void refreshData() {
    for (DataFragment dataFragment : mPagerAdapter.getFragments()) {
     dataFragment.refreshData();
}

各フラグメント内のブロードキャスト レシーバーを使用して一時的にこの問題を修正しましたが、この解決策は無駄であり、メモリ リークが発生する可能性があります。これを正しく修正するにはどうすればよいですか?ランドスケープ モードでは別のレイアウトとロジックを使用しているため、向きの変更後に新しく作成されたフラグメントを使用したいと考えています。

4

4 に答える 4

-1

私は同様の問題を抱えていました。私の作業ソリューション: In activity where is a adapter calladapter.notifyDataSetChanged();

アダプタで getItemPostion() メソッドをオーバーライドする

@Override
    public int getItemPosition(Object object) {
        MyFragment frag = (MyFragment)object;
        frag.refresh();
        return POSITION_UNCHANGED;
    }

私のFragmentStatePagerAdapater(私のアダプター)には1種類のフラグメントしか含まれていませんが、instanceof(より多くの種類のフラグメントに)使用してからキャストを使用するか、すべてのフラグメントがメソッドを使用してインターフェイスを実装できると思いますrefresh()

次に、フラグメントにメソッドを追加refresh()し、この実装を使用します。

public void refresh() {
        LayoutInflater inflater = LayoutInflater.from(getActivity());
        ViewGroup viewGroup = (ViewGroup) getView();
        viewGroup.removeAllViewsInLayout();
        View view = onCreateView(inflater, viewGroup, null);
        viewGroup.addView(view);

    }

これは私にとってはうまくいきました。私の意見: デバイスの向きが変わったときにアダプターが破棄されたときに問題が発生しましたが、フラグメントはまだメモリ内にあり、システムは向きの変更後にそれらを再利用しようとしましたが、フラグメントに含まれているビューも破棄され、フラグメントが必要です「再作成」します(onCreateViewメソッドを呼び出します)。間違っているかもしれませんので訂正お願いします…。

(私の英語でごめんなさい)

于 2014-10-13T19:15:41.277 に答える