2012-10-06 82 views
1

我有以下類擴展片段:如何更新Fragment UI中的數據?

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

一個可能的解決方案是:

  1. 創建靜態全局變量方面
  2. 創建上下文= inflater.getContext()。
  3. 更新UI時使用上下文創建ArrayAdapter。

變化:

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

使用片段中的Observer而不是調用updateGridView()Fragment之外。在您的Fragment中有Observer,請在您的主Activity中觀察Observable。當數據需要更新時,只需撥打ObservablenotifyObservers()方法即可。該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類(與任何類一樣)以及定製Observable對象。這超出了我想要查找的範圍,但我已經將一些wiki和howtos鏈接到了下面。

觀察員觀察的模式:http://en.wikipedia.org/wiki/Observer_pattern

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

相關問題