在項目中通用日歷界面,遇到了在加載日歷界面的同時,向服務器請求日期列表,進而標記這些日期。然而,在使用的時候,一開始不知道該怎么操作,只好將請求數據的操作放在了進入該界面前的點擊事件中。造成通用性極差。
在學習http://blog.csdn.net/column/details/androidcustomview.html 自定義View 后才知道,有方法可以刷新界面。invalidate(),用於UI線程(也就是主線程中)刷新界面。而在子線程中刷新界面,則有方法Postinvalidate()方法。這兩個方法解決了界面刷新問題。
那么問題來了。日歷是用GridView寫的,如果只刷新界面,適配器中的數據並未改變,還是無法將獲取的日期列表標記上去。所以,又去找方法。
notifyDataSetInvalidated() 和notifyDataSetChanged()方法。這兩個方法完美的解決了我的問題。
兩者都是適配器自帶的方法,用來刷新適配器,從而使適配器中的數據源發生改變。界面發生變化。
Handler handler = new Handler() { @SuppressWarnings("unchecked") @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case Constant.GET_LOGDATE: String code = "4"; List<Map<String, String>> list = (List<Map<String, String>>) msg.obj; if (list.get(0).containsKey("errcode")) { code = list.get(0).get("errcode"); } if (code.equals("2") || code.equals("3") || code.equals("0")) { Map<String, String> map = new HashMap<String, String>(); list.add(map); } listDate = list; setListSelected(); // calV.notifyDataSetInvalidated(); calV.notifyDataSetChanged(); break; } } };
對於全局變量,這里也要提一下,如果你的全局變量所在界面被多個程序調用。記得在初始化的時候,將全局變量清空或者賦予初值。避免上一次調用時,全局變量已被賦值。
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); listselected.clear(); //記得清空list listDate.clear(); setContentView(R.layout.activity_common_calendar); Intent data = getIntent(); viewid = data.getIntExtra("viewid", 0); initView(); getlogdate(); initCalendar(); }