2

ViewPager フラグメント内にあるフラグメントで ListView を更新しようとすると問題が発生します。全体のシナリオは、FragmentActivity がフラグメント間で通信するためのベースのように機能することです。

具体的には、ListFragment の単一選択フラグメントが FragmentActivity でオブジェクト参照を送信し、これが ViewPager フラグメントにリダイレクトされ、ViewPager フラグメントが別の Fragment 子を更新する必要があります。

すべてが完璧に動作しているように見え、最初に作成された ViewPager フラグメントに必要なデータが表示されますが、その後、このコード ブロックの ViewPager フラグメントに入るときに、この手順を開始する ListFragment の行を選択すると、

public void refreshDataWithClassType(ClassType classType) {
        Log.d(TAG, "Should refresh data");
        FragmentPagerAdapter fragmentPagerAdapter = (FragmentPagerAdapter) viewPager.getAdapter();
        for(int i = 0; i < fragmentPagerAdapter.getCount(); i++) {
            ExamsListFragment viewPagerFragment = (ExamsListFragment) fragmentPagerAdapter.getItem(i);
            if(viewPagerFragment != null) {
                // Do something with your Fragment
                // Check viewPagerFragment.isResumed() if you intend on interacting with any views.
                viewPagerFragment.refreshExams(classType.getClassTypeId());
            }
        }
    }

すべての ViewPagerFragment にメッセージを送信してデータを更新するだけです (Exams)。しかし、NullPointerException を取得してしばらくすると、refreshExams メソッドで、

public void refreshExams(int classTypeId) {
        Bundle args = new Bundle();
        args.putInt(KEY_POSITION, getArguments().getInt(KEY_POSITION));
        args.putInt(KEY_CLASS_TYPE, classTypeId);
        setArguments(args);

        getRepositoryExams();

        if (examsArrayAdapter == null) Log.d(TAG, "ExamsArrayAdapter is NULL");
        if (getActivity() == null) Log.d(TAG, "Activity is NULL");

        if (examsList.size() == 0) {
            examsArrayAdapter.clear();
            examsArrayAdapter.notifyDataSetChanged();
        } else {
            examsArrayAdapter = new ExamsArrayAdapter(getActivity(), R.layout.exam_row_layout, (ArrayList<Exam>) examsList);
            listView.setAdapter(examsArrayAdapter);
        }
    }

今でも、この Fragment のインスタンスを既に持っているはずですが、初めて作成されても問題ありません。

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);

        rootView = inflater.inflate(R.layout.exams_list_fragment, container, false);
        listView = (ListView) rootView.findViewById(R.id.examsListView);

        return rootView;
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        try {
            callBackExamListener = (OnExamSelectedListener) activity;
        } catch (ClassCastException ex) {
            throw new ClassCastException(activity.toString() + " must implement OnExamSelectedListener");
        }
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        getRepositoryExams();
        examsArrayAdapter = new ExamsArrayAdapter(getActivity(), R.layout.exam_row_layout, (ArrayList<Exam>) examsList);
        listView.setAdapter(examsArrayAdapter);
        listView.setOnItemClickListener(listRowItemClickListener);
    }

getActivity() および ExamsArrayAdapter は NULL です ????

これを修正する方法は?

前もって感謝します!

4

2 に答える 2

2

私は実際にここに私のコードのいくつかを認識しています。viewPagerFragment何が起こっているのかと思うと、取得しているs が にあることを確認していないためonResume、現在のページから 1 ページ以上離れていると、それらが破棄される可能性があります。viewPagerFragmentが にない場合はonResume、 メソッドを使用して にブール値フラグを設定し、 に入ったときにviewPagerFragment呼び出されるようにする必要があります。refreshExamsonResume

    FragmentPagerAdapter fragmentPagerAdapter = (FragmentPagerAdapter) viewPager.getAdapter();
    for(int i = 0; i < fragmentPagerAdapter.getCount(); i++) {
        ExamsListFragment viewPagerFragment = (ExamsListFragment) fragmentPagerAdapter.getItem(i);
        if(viewPagerFragment != null) {
            // Do something with your Fragment
            // Check viewPagerFragment.isResumed() if you intend on interacting with any views.
            if(viewPagerFragment.isResumed())
                viewPagerFragment.refreshExams(classType.getClassTypeId());
        }
    }

ただし、実際には、上記のコードは、を保持するためFragmentPagerAdapterに を使用して を作成したため、 でのみうまく機能することがわかりました。Android が と を破棄したため、回転中にこれが失敗しました。を照会してから を取得し、リフレッシュする前にそれぞれが入っているかどうかを確認し、それ以外の場合はフラグをリフレッシュするように設定することをお勧めします。この質問に対する受け入れられた答えは、の子供たちを調べるための正しいアプローチです。ArrayListFragmentgetItemActivityFragmentFragmentManagerFragmentViewPagerviewPagerFragmentonResumeViewPagerFragment

于 2013-02-27T21:46:41.763 に答える