android 异步加载数据值刷新UI界面
在项目中通用日历界面,遇到了在加载日历界面的同时,向服务器请求日期列表,进而标记这些日期。然而,在使用的时候,一开始不知道该怎么操作,只好将请求数据的操作放在了进入该界面前的点击事件中。造成通用性极差。
在学习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();
}
不积跬步,无以至千里。

浙公网安备 33010602011771号