0

過去 19 時間、 を更新しようとしてlistFragmentいますが、 を操作できませんnotifyDataSetChanged()。私はそれについて多くのスレッドを訪問しましたが、それを機能させることができませんでした。親 Fragment があり、この中に 3 つのListFragment. はListFragmentそれらの間でデータを渡す必要があり、 を介してこれを行うことができますinterface。情報は正常に渡されています。しかし、ListView更新されていません。これは私の試みのコードです:

public class SubChaptersListFragment extends SherlockListFragment {

    ArrayAdapter<String> mAdapter = null;
    ArrayList<String> items = new ArrayList<String>();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        int layout = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ? android.R.layout.simple_list_item_activated_1
                : android.R.layout.simple_list_item_1;
        Chapter instance = CompetitiveProgramming.chapterList.get(0);
        for (int i = 0; i < instance.subchapterList.size(); i++) {
            items.add(instance.subchapterList.get(i).subChapterTitle);
        }
        mAdapter = new ArrayAdapter<String>(getSherlockActivity(), layout, items);
        setListAdapter(mAdapter);
    }

    @Override
    public void onStart() {
        super.onStart();
        if (getFragmentManager().findFragmentById(
                R.id.sub_sub_category_fragment) != null) {
            getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        }
    }

    // this function is invoked from another `fragment` and position is retrieved successfully
    public void updateList(int position) {
        Chapter instance = CompetitiveProgramming.chapterList.get(position);
        items.clear();
        for (int i = 0; i < instance.subchapterList.size(); i++) {
            items.add(instance.subchapterList.get(i).subChapterTitle);
        }
        mAdapter.notifyDataSetChanged(); // nullpointerException in this line
    }

}

Logcat を編集

08-13 18:33:30.670: E/AndroidRuntime(537): java.lang.NullPointerException
08-13 18:33:30.670: E/AndroidRuntime(537):  at me.kaidul.uhunt.SubChaptersListFragment.updateList(SubChaptersListFragment.java:57)
08-13 18:33:30.670: E/AndroidRuntime(537):  at me.kaidul.uhunt.CompetitiveProgramming.onChapterSelected(CompetitiveProgramming.java:214)
08-13 18:33:30.670: E/AndroidRuntime(537):  at me.kaidul.uhunt.ChaptersListFragment.onListItemClick(ChaptersListFragment.java:60)
08-13 18:33:30.670: E/AndroidRuntime(537):  at android.support.v4.app.ListFragment$2.onItemClick(ListFragment.java:58)
08-13 18:33:30.670: E/AndroidRuntime(537):  at android.widget.AdapterView.performItemClick(AdapterView.java:284)
08-13 18:33:30.670: E/AndroidRuntime(537):  at android.widget.ListView.performItemClick(ListView.java:3382)
08-13 18:33:30.670: E/AndroidRuntime(537):  at android.widget.AbsListView$PerformClick.run(AbsListView.java:1696)
08-13 18:33:30.670: E/AndroidRuntime(537):  at android.os.Handler.handleCallback(Handler.java:587)

これは、parentFragment からフラグメントを呼び出す方法です。

@Override
public void onChapterSelected(int position) {
    SubChaptersListFragment subChapterFrag = new SubChaptersListFragment();
    if ( subChapterFrag != null) {
        subChapterFrag.updateList(position);
    } else {

    }

}
4

1 に答える 1

2

あなたの問題は、単純な null ポインターよりもはるかに深刻です。

問題の症状は、呼び出されたmAdapterときに null になることupdateList()です。CompetitiveProgramming.onChapterSelected()より大きな問題は、呼び出し時に SubChaptersListFragment が作成されていないことですupdateList()

ライフサイクルを考慮せずに、あるフラグメント (ChaptersListFragment) から別のフラグメント (SubChaptersListFragment) への直接参照を行っている可能性があります。

フラグメントを呼び出す前に、フラグメントが作成され、アクティビティにアタッチされていることを確認する必要があります。アクティビティの FragmentManager を使用してフラグメントの存在を確認し、必要に応じてフラグメントを作成することをお勧めします。

于 2013-08-13T12:21:14.493 に答える