NetJSONAdapter 網路化的adapter(高效率) -dhroid文檔

tags:    時間:2014-04-07 11:10:23
NetJSONAdapter 網路化的adapter(高效) -dhroid文檔

關於adapter 我想對於大家來說已經不陌生了,基本應用都會用的很多,不知道現在你是不是還是按一定的套路寫很多代碼去實現adapter

我想大多數人還是寫個adapter繼承自baseadapter 實現getView方法(我想大家還會用網路流行的viewholder模式吧),

如果數據來自網路用個網路訪問工具訪問數據,數據轉換,然後add進adapter,如果有下拉刷新,載入更多代碼會更多

問題

1.你在寫很多重複代碼

2.數據管理不是那麼容易

3.網路緩存需要處理

 

如果你使用dhroid框架,這些問題可以很好的解決

先看下下面的代碼

 

NetJSONAdapter	adapter=new NetJSONAdapter("http://shishangquan.017788.com/mobile_ordermeal_jujiList", this, R.layout.adapter_item); 		//添加參數 		adapter.addparam("key1", "key1"); 		//數據綁定 		adapter.addField("username", R.id.name); 		adapter.addField("title", R.id.title); 		//數據綁定 進行文本修飾 		adapter.addField("pubdate", R.id.time,"time"); 		//數據綁定 進行圖片修飾 		adapter.addField("user_faceimg", R.id.pic,"round");                 //緩存策略 		adapter.useCache(CachePolicy.POLICY_CACHE_AndRefresh);                 //刷新                 adapter.refresh(); 	        //綁定到listview中 		listV.setAdapter(adapter);

 

 

//這段代碼進行了網路訪問,生成視圖,數據綁定,緩存策略等問題

會通過R.layout.adapter_item生成視圖,這裡生成的視圖用了重用機制,和ViewHolder模式(居然我感覺ViewHolder用處不大)

 

假設網路返回的結果是

 

{   success:true,    data:[{       username:'藤之內',       title:'大家好',       pubdate:1394707561,        user_faceimg:'頭像路徑'     },{  }] }

 

 

NetJSONAdapter 會自動進行解析數據

  • 會將username綁定到id為R.id.name的textview上
  • 會將pubdate綁定到id為R.id.time 的textview上,這裡需要進行數據轉化,獲取到的值是1394707561,最後顯示當然為2012-11-08   我們在最後一個參數寫為time  ,具體的轉化是寫到ValueFix介面的(下面在說)
  • 會將user_faceimg獲取到的圖片路徑綁定到R.id.pic的imageView,這裡也做了個轉化,是將圖片截圓角, 我們在最後一個參數寫為round,具體的轉化是寫到ValueFix介面的(下面在說)

    adapter.useCache(CachePolicy.POLICY_CACHE_AndRefresh);可以進行緩存策略,具體的緩存策略大家看DhNet的文檔吧

 

   adapter.refresh();刷新

 

我們先說網路相關的

添加參數 adapter.addparam("key1", "key1");//  載入下一頁 adapter.showNext();  載入下一頁有對話框 adapter.showNextInDialog(); 緩存策略(查看dhnet文檔) adapter.useCache(CachePolicy.POLICY_CACHE_AndRefresh);   載入第一頁時是否有對話康 adapter.showProgressOnFrist(true); 

 

 

 

 

數據處理相關

   拿哪個節點作為數據(支持點分割)

    adapter.fromWhat("aaa.bbb");

 //如果你的結果不是在某個節點而是需要處理后才有的

		adapter.setDataBulider(new DataBulider() { 			 			@Override 			public JSONArray onDate(Response response) { 				return response.jSONArrayFrom("xxx"); 			} 		});

 

	adapter.addField("title", R.id.title); 		//數據綁定 進行文本修飾 		adapter.addField("pubdate", R.id.time,"time"); 		//數據綁定 進行圖片修飾 		adapter.addField("user_faceimg", R.id.pic,"round");

 如果你需要控制顯示與隱藏等

adapter.addField(new FieldMap("activeaddress", R.id.content) { 			@Override 			public Object fix(View itemV, Integer po, Object o, Object jo) { 				JSONObject joo=(JSONObject) jo; 				//這裡可以做一些額外的工作 				itemV.findViewById(R.id.icon).setVisibility(JSONUtil.getInt(joo, "status")==1?View.VISIBLE:View.INVISIBLE); 				return o; 			} 		});

 

事件回調每次載入完成後在這處理

	//載入成功后回調 		adapter.setOnLoadSuccess(new LoadSuccessCallBack() { 			@Override 			public void callBack(Response response) { 				if(response.isSuccess()){ 					dialoger.showToastShort(getActivity(), "載入成功"); 					if(adapter.getPageNo()==1){ 						listV.setSelection(0); 					} 					 				} 			} 		});

 

 內部點擊事件

	//內部點擊事件 		adapter.setOnInViewClickListener(R.id.pic, new BeanAdapter.InViewClickListener() {  			@Override 			public void OnClickListener(View itemV, View v, Integer po, 					Object jo) { 				JSONObject joo=(JSONObject) jo; 				dialoger.showToastLong(getActivity(), JSONUtil.getString(joo, "username")); 			} 		});

 

 adapter需要配置的常量(配置在application中)

                               //分頁參數                                 Const.netadapter_page_no = "p"; 		//分頁參數的長度                                 Const.netadapter_step = "step"; 		                                 //默認分頁長度 		        Const.netadapter_step_default = 7;                            //時間線參數(傳入後台的key)                           Const.netadapter_timeline = "timeline";      	                             //時間線取哪個欄位                                 Const.netadapter_json_timeline="pubdate";

 

關於時間線指每次會將上次最後一條的哪個屬性作為下次訪問的參數

 

 下面說說上面提到的數據修飾問題

 

  數據修飾需要在ioc中配置實現了ValueFix介面的類

  介面有下面方法   

     

如果是textview和且子類調用        public abstract Object fix(Object obj, String s);         傳入第一個參數是原值第二個參數類型        如實現為          @Override 	public Object fix(Object o, String type) { 		if (o == null) 			return null; 		if ("time".equals(type)) { 			return getStandardTime(Long.parseLong (o.toString()) * 1000, 					"yyyy-MM-dd"); 		} 		 		return o; 	} 傳入的是1394707561和'time' 返回的是2014-11-08 
  如果是imageview       public abstract DisplayImageOptions imageOptions(String s);  出入的是類型 round返回的是DisplayImageOptions  DisplayImageOptions 是universalimageloader.jar中的我們使用的是圖片載入就是它 

 

我還要說明下NetJSONAdapter的繼承關係

    NetJSONAdapter繼承了BeanAdapter類實現了INetAdapter介面

    BeanAdapter 對數據進行了很好的管理和視圖綁定實現時

    public abstract void bindView(View view, int i, Object obj);

   可以仿照NetJSONAdapter的bindView實現

 

INetAdapter定義了網路相關的方法

	public String getTag(); 	 	public void refresh(); 	 	public void setOnLoadSuccess(LoadSuccessCallBack loadSuccessCallBack); 	 	public void removeOnLoadSuccess(LoadSuccessCallBack loadSuccessCallBack); 	 	public void setOnTempLoadSuccess(LoadSuccessCallBack loadSuccessCallBack); 	 	public Boolean hasMore(); 	 	public void showNext(); 	 //	public boolean isLoding(); 	 	public void showNextInDialog();

 這樣在實現的listview中可以根據adapter的類型進行網路操作

我實現的下拉刷新的list就是這樣寫的

下拉刷新的問題不需要寫多少代碼

  下一章會講講下拉刷新問題

 

 

 

 

 

 

 

推薦閱讀文章

Bookmark the permalink ,來源:互聯網