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

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM