日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

动态加载省市区

發(fā)布時間:2024/3/13 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动态加载省市区 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

現(xiàn)在網(wǎng)上關(guān)于省市區(qū)三聯(lián)動的demo很多,包括之前的blog也寫過。那為啥還要再寫一次?原因是:

項目中這次是改版,也就是流程不動,只是改變顯示方式。接手之前的demo已經(jīng)使用spinner實現(xiàn)了省市區(qū)加載。

現(xiàn)在新需求是:

動態(tài)加載省市區(qū),在新的一個新的頁面,點擊某一省(動態(tài)獲取) 展開該省所有的市(動態(tài)獲取),再點擊某一市,加載該市所有的區(qū)(也是動態(tài)獲取);

查看了很多資料,很多demo的數(shù)據(jù)源來源:

  • 本地文件,在/assets目錄也會提供存放資源文件
  • 服務(wù)器返回省市區(qū)所有數(shù)據(jù),包括省市區(qū)對應(yīng)的關(guān)系,如id、pId、name

由于是改版,所以服務(wù)器數(shù)據(jù)源不會變,還是按照以前的返回方式:

1、無參請求,服務(wù)器返回所有的省,數(shù)據(jù)結(jié)構(gòu)為:* {* "Results": [* {* "ShopProvinceName": "云南省"* },* {* "ShopProvinceName": "上海市"* }* ],* "Total": 0,* "Code": 0,* "ServiceTime": 1492496783* } 2、點擊某一省,返回該省下所有的市,返回數(shù)據(jù)結(jié)構(gòu)為:* {* "Results": [* {* "ShopCityName": "上海市"* }* ],* "Total": 0,* "Code": 0,* "ServiceTime": 1492496879* } 3、點擊某一市,返回該市下所有的區(qū),數(shù)據(jù)結(jié)構(gòu)為* {* "Results": [* {* "ShopDistrictName": "寶山區(qū)"* },* {* "ShopDistrictName": "長寧區(qū)"* },* {* "ShopDistrictName": "奉賢區(qū)"* },* {* "ShopDistrictName": "虹口區(qū)"* },* {* "ShopDistrictName": "黃浦區(qū)"* },* {* "ShopDistrictName": "嘉定區(qū)"* },* {* "ShopDistrictName": "金山區(qū)"* },* {* "ShopDistrictName": "閔行區(qū)"* },* {* "ShopDistrictName": "浦東新區(qū)"* },* {* "ShopDistrictName": "普陀區(qū)"* },* {* "ShopDistrictName": "青浦區(qū)"* },* {* "ShopDistrictName": "松江區(qū)"* },* {* "ShopDistrictName": "徐匯區(qū)"* },* {* "ShopDistrictName": "楊浦區(qū)"* },* {* "ShopDistrictName": "閘北區(qū)"* }* ],* "Total": 0,* "Code": 0,* "ServiceTime": 1492496905* }

所以,不光要展示樹形結(jié)構(gòu),還要動態(tài)獲取數(shù)據(jù)


如果所有的數(shù)據(jù)源都返回,不需要動態(tài)加載,可以參考以下方式實現(xiàn):
ExpandableListView使用解析(三級列表的實現(xiàn))

現(xiàn)在進入正題:
先來張效果圖

首先,樹形結(jié)構(gòu)實現(xiàn)參考的是鴻洋大神的打造任意層樹形控件,實現(xiàn)思路也是將服務(wù)器數(shù)據(jù)轉(zhuǎn)換為Node類型數(shù)據(jù),在此期間給數(shù)據(jù)源設(shè)置節(jié)點關(guān)系。多說無益,看代碼:
首先,獲取服務(wù)器數(shù)據(jù)源,并轉(zhuǎn)換為Node類型數(shù)據(jù)。期間伴隨有Node節(jié)點的點擊事件(獲取當前節(jié)點的子節(jié)點)。

/*** 獲取省市區(qū),并將服務(wù)器數(shù)據(jù)源轉(zhuǎn)換為Node類型數(shù)據(jù)* @param jsonObject 封裝的請求參數(shù)* @param code 請求分別code* @param parentId pId 點擊事件傳過來的ID,作為 被點擊節(jié)點 的子節(jié)點的Pid* @param position 點擊k節(jié)點所在的position,*/long temp = 10000;//為了標記子節(jié)點的id,避免與父節(jié)點ID重復(fù),取值從10000開始private void getPlace(JSONObject jsonObject, int code, long parentId, int position) {app.post("QueryShopCity", jsonObject, new App.CallbackJson() {@Overridepublic void json(JSONObject data) {pd.dismiss();QueryShopCityRes queryShopCityRes = JSON.parseObject(data.toString(), QueryShopCityRes.class);ArrayList<ItemQueryShopCity> list = queryShopCityRes.getResults();switch (code) {case REQUEST_PROVICNE_CODE://省//獲取所有的省,并將省轉(zhuǎn)換為Node數(shù)據(jù),設(shè)置其ID,pID,NodeName(也就是設(shè)置節(jié)點間關(guān)系)for (int i = 0; i < list.size(); i++) {Node node = new Node();node.setName(list.get(i).getShopProvinceName());//設(shè)置節(jié)點名node.setpId(parentId);//設(shè)置父節(jié)點Idnode.setId(temp);//設(shè)置節(jié)點Idtemp++;provinceList.add(node);}CommonList.addAll(provinceList);break;case REQUEST_CITY_CODE://市CommonList.clear();cityList.clear();districtList.clear();for (int i = 0; i < list.size(); i++) {Node node = new Node();node.setName(list.get(i).getShopCityName());node.setpId(parentId);node.setId(temp);temp++;cityList.add(node);}CommonList.addAll(provinceList);CommonList.addAll(cityList);break;case REQUEST_DISTRICT_CODE://區(qū)CommonList.clear();districtList.clear();for (int i = 0; i < list.size(); i++) {Node node = new Node();node.setName(list.get(i).getShopDistrictName());node.setpId(parentId);node.setId(temp);temp++;districtList.add(node);}CommonList.addAll(provinceList);//加入省CommonList.addAll(cityList);//加入市CommonList.addAll(districtList);break;}try {if (mProvinceAdapter == null) {Log.d("未點擊的數(shù)據(jù)源", CommonList.get(position).toString());mProvinceAdapter = new ProvinceListAdatper<Node>(listview, FilterDrugStoreActivity.this, CommonList, 0, true, position);listview.setAdapter(mProvinceAdapter);} else {mProvinceAdapter.list = CommonList;//將請求到的數(shù)據(jù)傳遞給TreeListViewAdapter,進而重新進行數(shù)據(jù)轉(zhuǎn)換(服務(wù)器返回數(shù)據(jù)--->Node樹形結(jié)構(gòu)數(shù)據(jù))mProvinceAdapter.getDatas(position);//進行數(shù)據(jù)轉(zhuǎn)換并更新UI}/*** 樹形結(jié)構(gòu)節(jié)點的點擊事件*/mProvinceAdapter.setOnTreeNodeClickListener(new TreeListViewAdapter.OnTreeNodeClickListener() {@Overridepublic void onClick(Node node, int position) {//請求市列表String provinceName = "";String cityName = "";String districtName = "";if (0 == node.getLevel()) {//第一層級provinceName = node.getName();JSONObject provinceObj = new JSONObject();provinceObj.put("ProvinceName", provinceName);if (node.getChildren().size() <= 0) {getPlace(provinceObj, REQUEST_CITY_CODE, node.getId(), position);//請求市級城市列表}} else if (1 == node.getLevel()) {//第二層級//請求區(qū)列表provinceName = node.getParent().getName();cityName = node.getName();JSONObject provinceObj = new JSONObject();provinceObj.put("ProvinceName", provinceName);provinceObj.put("CityName", cityName);if (node.getChildren().size() <= 0) {getPlace(provinceObj, REQUEST_DISTRICT_CODE, node.getId(), position);//請求市級城市列表}} else if (2 == node.getLevel()) {//第三層級//區(qū)列表點擊事件districtName = node.getName();Node city = node.getParent();Node province = city.getParent(); // Toast.makeText(FilterDrugStoreActivity.this, "省:"+province+",市"+city+",區(qū)"+districtName, Toast.LENGTH_SHORT).show();//進行藥店篩選ItemQueryShopCity bean = new ItemQueryShopCity();bean.setShopProvinceName(province.getName());bean.setShopCityName(city.getName());bean.setShopDistrictName(districtName);Intent intent = new Intent(FilterDrugStoreActivity.this, DrugStoreActivity.class);Bundle bundle = new Bundle();bundle.putSerializable("request_shop", bean);intent.putExtras(bundle);setResult(RESULT_OK, intent);finish();}}});} catch (IllegalAccessException e) {e.printStackTrace();}/*** 注意:不要亂刷新適配器,以致造點擊成屏幕的時候滾動(如點擊省市區(qū)三級列表的時候會重新進行頁面繪制)* if (adapter == null) {* listview.setadapter(adapter)* } else{* adapter.notifyDataSetChanged();* }* 在需要刷新的地方進行notifyDataSetChanged就可以,不要使用listview.setadapter();*/ // listview.setAdapter(mProvinceAdapter);}}, error -> {app.pop(FilterDrugStoreActivity.this, error);pd.dismiss();});}



通過:mProvinceAdapter.list = CommonList;//將請求到的數(shù)據(jù)傳遞給TreeListViewAdapter,進而重新進行數(shù)據(jù)轉(zhuǎn)換(服務(wù)器返回數(shù)據(jù)—>Node樹形結(jié)構(gòu)數(shù)據(jù)),主要為了將點擊之后請求到的數(shù)據(jù)傳遞給TreeListViewAdapter,進行數(shù)據(jù)轉(zhuǎn)換(轉(zhuǎn)換成Node類型),不能通過構(gòu)造方法傳遞數(shù)據(jù)源。因為adapter.notifyDataSetChanged只會重走getView()方法,所以這個時候數(shù)據(jù)源不會被構(gòu)造方法中的如下方法做任何處理。也就是刷新適配器不起作用

/*** 過濾出可見的Node*/mNodes = TreeHelper.filterVisibleNode(mAllNodes); // mNodes = TreeHelper.filterVisibleNode(datas);mInflater = LayoutInflater.from(context);



數(shù)據(jù)源轉(zhuǎn)換可以通過:mProvinceAdapter.getDatas(position);

/*** 將點擊之后的數(shù)據(jù)重新轉(zhuǎn)換為Node類型數(shù)據(jù),** @param position* @return*/public void covertDatas2Node(int position) {try {if (list.size() > 0) {mAllNodes = TreeHelper.getSortedNodes(list, 0);}} catch (IllegalAccessException e) {e.printStackTrace();}/*** add by junl 2017-4-13* 去除重復(fù)元素*/if (mAllNodes.size() > 0) {for (int i = 0; i < mAllNodes.size(); i++) {long id = mAllNodes.get(i).getId();for (int j = mAllNodes.size() - 1; j > i; j--) {if (id == mAllNodes.get(j).getId()) {mAllNodes.remove(j);}}}}/*** 過濾出可見的Node*/mNodes = TreeHelper.filterVisibleNode(mAllNodes);}public void getDatas(int pos) {covertDatas2Node(pos);if (mNodes.get(pos).getChildren().size() > 0) {Log.d("點擊之后的數(shù)據(jù)源",mNodes.get(pos).toString());expandOrCollapse(pos);}}



經(jīng)過以上方法處理,數(shù)據(jù)源會變成Node類型的數(shù)據(jù),進而實現(xiàn)點擊節(jié)點展開或收縮其子節(jié)點

適配器adapter

class ProvinceListAdatper<T> extends TreeListViewAdapter<T> {public ProvinceListAdatper(ListView mTree, Context context, List datas, int defaultExpandLevel, boolean isExpand, int pos) throws IllegalArgumentException, IllegalAccessException {super(mTree, context, datas, defaultExpandLevel, isExpand, pos);}@Overridepublic View getConvertView(com.zmyseries.march.insuranceclaims.ui.discovery.Node node, int position, View convertView, ViewGroup parent) {ViewHolder viewHolder = null;if (convertView == null) {convertView = mInflater.inflate(R.layout.list_item, parent, false);viewHolder = new ViewHolder();viewHolder.tvName = (TextView) convertView.findViewById(R.id.tv_node_name);convertView.setTag(viewHolder);} else {viewHolder = (ViewHolder) convertView.getTag();}viewHolder.tvName.setText(node.getName());if (0 == node.getLevel()) {viewHolder.tvName.setTextColor(getResources().getColor(R.color.province_text_color));} else if (1 == node.getLevel()) {viewHolder.tvName.setTextColor(getResources().getColor(R.color.city_text_color));} else if (2 == node.getLevel()) {viewHolder.tvName.setTextColor(getResources().getColor(R.color.district_text_color));}/*** 點擊事件盡量設(shè)置給暴露出來的adapter;mProvinceAdapter.setOnTreeNodeClickListener{}*/ // viewHolder.tvName.setOnClickListener(new View.OnClickListener() { // @Override // public void onClick(View v) {}});return convertView;}private final class ViewHolder {TextView tvName;}}

代碼中注釋已經(jīng)寫的很清楚了,所以不多解釋。

由于技術(shù)局限性,難免存在問題,敬請指出,不勝感謝。

總結(jié)

以上是生活随笔為你收集整理的动态加载省市区的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 神马久久香蕉 | 亚洲一区二区三区在线视频 | 在线观看成人av | 日韩成人av一区 | 久久免费视频6 | 亚洲福利视频网 | av短片| 日韩xx视频 | 国产一区二区视频免费观看 | 91久久精品一区二区 | 亚洲三区在线观看无套内射 | 漂亮人妻被黑人久久精品 | 成年人免费在线视频 | 蜜桃视频免费网站 | 日韩伊人 | 少妇特黄一区二区三区 | 一区二区三区国产精品 | 亚洲国产免费看 | 自拍偷拍av | 国产精品视频导航 | 久久精品黄aa片一区二区三区 | 夏晴子在线| 91黄色国产 | 九色porny自拍视频在线播放 | 精品久久网 | 日本久久久久久久久久久 | 无码成人精品区在线观看 | 日韩中出| 蜜臀aⅴ免费一区二区 | 日本免费色视频 | 日韩第二页 | 青青久在线视频 | 熟妇高潮一区二区三区在线播放 | 黄片毛片视频 | 尤物193.com | 91色漫| 韩国美女被c | av青娱乐 | 图片区亚洲色图 | 日韩欧美综合在线 | 在线亚洲自拍 | 国产一级做a爰片在线看免费 | 免费观看一级一片 | 男女免费看| 黄色一级片在线免费观看 | av网址免费 | 欧美视频免费在线观看 | 国产亚洲欧洲 | 亚洲精品国偷拍自产在线观看蜜桃 | 国产一区二区在线视频 | 亚洲精品字幕在线 | 国产视频第二页 | 99热国产在线 | 男人的天堂av片 | 日本aⅴ视频 | 在线看视频 | 天天干天天色综合 | 强开小受嫩苞第一次免费视频 | 中文字字幕第183页 欧美特级一级片 | 99热在线看 | 日韩一区网站 | 日韩欧美一区二区一幕 | 久久国产精品免费 | 老司机在线永久免费观看 | 色噜噜综合 | 久久成人精品一区二区 | 在线观看的av | 五月天在线播放 | 亚洲视频在线网 | 亚洲精品热 | 亚洲欧洲av | 亚洲欧美国产一区二区三区 | 亚洲av永久无码精品一百度影院 | 国产人妖一区二区 | 美女被变态侵犯 | 日韩一区二区三区在线看 | 黄色在线免费观看视频 | 国产精品免费电影 | 999久久久国产 | 亚洲欧洲av在线 | 青青草久久 | 免费成人进口网站 | 天堂av一区 | 女女同性女同一区二区三区按摩 | 国产porn | 日本黄大片在线观看 | 岛国av在线免费 | 亚州av成人 | 色婷婷av一区二区三 | 天天综合天天做 | 91黄视频在线观看 | 国产欧美高清 | 亚洲第一在线 | 伊人小视频| xxx国产在线观看 | 极品久久久久久 | 中文精品无码中文字幕无码专区 | 美女福利影院 | 可以在线观看的av网站 |