如何在Fragment UI中更新数据?

时间:2012-10-06 16:58:45

标签: android

我有以下类扩展片段:

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?谢谢

2 个答案:

答案 0 :(得分:0)

一个可能的解决方案是:

  1. 创建静态全局变量上下文
  2. create context = inflater.getContext()。
  3. 更新用户界面时使用上下文创建ArrayAdapter。
  4. 变化:

    ...=new ArrayAdapter<Integer>(context,...)
    

答案 1 :(得分:0)

在片段中使用Observer,而不是在updateGridView()之外拨打Fragment。在ObserverFragment观察主Observable中的Activity。需要更新数据时,只需调用notifyObservers()的{​​{1}}方法即可。 Observable类应该是Fragment的子类,应该看起来像这样:

Observer

这样可以更新数据,而无需担心范围和所有爵士乐。只要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对象。这超出了我认为你正在寻找的范围,但我已将下面的一些wiki和howtos联系起来。

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

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