1

次のクラス拡張フラグメントがあります。

public static class DummySectionFragment extends Fragment {

    public static final String ARG_SECTION_NUMBER = "section_number";
    private GridView events;

    public DummySectionFragment() {}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        Bundle args = getArguments();
        switch (args.getInt(ARG_SECTION_NUMBER)) {
            case 1 : return initializeCalendarScreen(inflater);
            case 2 : return inflater.inflate(R.layout.todo_lists_layout, null);
        }         
        return null;           
    }

    public void updateGridView() {

        int daysInCurrentMonth=(MainActivity.month==1) ? daysInFebruary : COUNT_OF_DAYS_IN_MONTH[MainActivity.month];
        int daysInPrevMonth=(MainActivity.month-1==1) ? daysInFebruary : COUNT_OF_DAYS_IN_MONTH[MainActivity.month-1];
        int daysInNextMonth=(MainActivity.month+1==1) ? daysInFebruary : COUNT_OF_DAYS_IN_MONTH[MainActivity.month+1];

        Calendar calendar=Calendar.getInstance();
        calendar.set(MainActivity.year, MainActivity.month, 1);
        int startDayOfWeek=calendar.get(Calendar.DAY_OF_WEEK);
        List<Integer> dates=new ArrayList<Integer>();
        for (int i=0; i<startDayOfWeek-1; i++) {
            dates.add(daysInPrevMonth-i);
        }
        for (int i=0; i<daysInCurrentMonth; i++) {
            dates.add(i+1);
        }

        ArrayAdapter<Integer> adapter=new ArrayAdapter<Integer>(getActivity(), R.layout.grid_view_cell_layout, R.id.textViewGridCell, dates);
        events.setAdapter(adapter);
    }

    private View initializeCalendarScreen(LayoutInflater inflater) {
        View layout=inflater.inflate(R.layout.calendar_layout, null);
        events=(GridView)layout.findViewById(R.id.gridViewCalendar);
        updateGridView();
        return layout;
    }
}

うまく機能します(FragmentPagerAdapterに使用しています)。また、Activity のメソッド updateGridView() を使用して、GridView の値を更新します。しかし、それを行うと、ArrayAdapter の getActivity() が null を返すため、NullPointerException が発生します。アクティビティからフラグメント UI を更新する方法を教えてください。ありがとうございました

4

2 に答える 2

0

考えられる解決策は次のとおりです。

  1. 静的グローバル変数コンテキストを作成する
  2. コンテキストを作成 = inflater.getContext()。
  3. UI の更新時にコンテキストを使用して ArrayAdapter を作成します。

変化する:

...=new ArrayAdapter<Integer>(context,...)
于 2013-01-07T14:10:11.623 に答える
0

の外部Observerで呼び出す代わりに、フラグメントでan を使用します。あなたの観察にあなたのメインにあるを持ってください。データを更新する必要がある場合は、 のメソッドを呼び出すだけです。クラスは Fragmentの子クラスである必要があり、次のようになります。updateGridView()FragmentObserverFragmentObservableActivitynotifyObservers()ObservableObserver

class UpdateGridObserver implements Observer {
    @Override
    public void update(Observable observable, Object data) {
        // Do stuff like:
        // runOnUiThread is REQUIRED because updating the adapter
        // and ListView from a background thread is not allowed
        getActivity().runOnUiThread(new Runnable(){
            updateGridView();
        });
    }
}

これにより、スコープやすべてのジャズについて心配することなく、データを更新できます。Observableオブジェクトがオブジェクトにアクセスできる限り、問題はObserverありません。

通知以外の機能が必要な場合は、クラスを拡張してObservable(他のクラスと同様に) カスタムオブジェクトを作成することもできます。Observableあなたが探していると思う範囲外ですが、以下にいくつかのウィキとハウツーをリンクしました.

Observer-Observable パターン: http://en.wikipedia.org/wiki/Observer_pattern

詳細: http://www.javaworld.com/jw-10-1996/jw-10-howto.html

于 2013-01-07T15:18:42.770 に答える