我有以下类扩展片段:
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?谢谢
答案 0 :(得分:0)
一个可能的解决方案是:
变化:
...=new ArrayAdapter<Integer>(context,...)
答案 1 :(得分:0)
在片段中使用Observer
,而不是在updateGridView()
之外拨打Fragment
。在Observer
中Fragment
观察主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