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 中的值。但是如果我这样做,我会得到 NullPointerException,因为 ArrayAdapter 的 getActivity() 返回 null。请告诉我,如何从 Activity 更新 Fragment UI?谢谢

4

2 回答 2

0

Observer在 Fragment 中使用 an而不是updateGridView()Fragment. Observer在你的Fragment观察中有一个Observable在你的 mainActivity中。当需要更新数据时,只需notifyObservers()调用Observable. 该类Observer应该是您的 Fragment 的子类,并且应该如下所示:

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这超出了我认为您正在寻找的范围,但我在下面链接了一些 wiki 和 howtos。

观察者-可观察模式:http ://en.wikipedia.org/wiki/Observer_pattern

更多:http ://www.javaworld.com/jw-10-1996/jw-10-howto.html

于 2013-01-07T15:18:42.770 回答
0

一种可能的解决方案是:

  1. 创建静态全局变量上下文
  2. 创建上下文 = inflater.getContext()。
  3. 更新 UI 时使用上下文创建 ArrayAdapter。

改变:

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