Your browser does not support the audio element.

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();
		
	}

  

 

posted @ 2015-02-11 17:10  shoneworn  阅读(7940)  评论(0)    收藏  举报