JSON,ListView AsyncHttpClient 等第三方包的综合实应用
来源:互联网 发布:蒙古族 知乎 编辑:程序博客网 时间:2024/05/20 02:24
前文中简单的介绍了 JSON 及其解析,现在将解析得到的数据应用到 ListView 上,所用的第三方包和 .aar 文件 如下图(.arr文件中有删减,留下精简部分,分享在我的云盘上:http://pan.baidu.com/s/1gdLtZXL,由于时间的推移,分享的版本可能跟不上以后的节奏,因为我不会去更新它们):
总的运行效果如下:
大体思路如下:
(1)先从网络上读取 JSON 信息,文中有使用 AsyncTask 异步下载和第三方的开源包;
(2)解析 JSON 数据,并将其传递给 MyAdapter 类;
(3)在 MyAdapter 类中根据 getCardType() 信息分为 2 中在 ListView 中的显示方式:横,竖;
(4)为 ListView 添加头部 ListHeader (ListView 分为 3 部分: 头部 ListHeader, 内容部分(我们常用的部分) ContentView,底部 FooterView,其中:头部,底部一般不可见);
(5)为了实现刷新的功能,利用的 google 提供的 SwipeRefreshLayout 刷新(注释掉的部分),也可使用 XListView , XListView 源代码有精简;
代码信息见文中注解;
关于 .aar 文件在 AndroidStudio 中导入如下:
(1)先将其导入 libs 目录下,在如下图所示的目录结构中找到 build.gradle 文件;
(2)在如上图所示的序列号 1 (workspace 目录项目)中加入如下代码:
(3)在序列号 2 (workspace的子目录,如 app,或者 module项目)中加入如下代码:
JSON 的来源(Tomcat)如下图:
格式化后得到的 JSON 文件 around 如下:
{ "resultCode": 1, "resultInfo": "SUCCESS", "info": { "pageInfo": { "total": 28, "pageSize": 10, "lastPageNumber": 3, "nowPage": 1, "currNum": 10 }, "merchantKey": [ { "merchantID": "5327", "name": "瑞庭竹岛酒店", "coupon": "网上预定入住可享返现优惠", "location": "四川省成都市高新区老成仁路8号", "distance": "203m", "picUrl": "http://www.warmtel.com/igme_pic/fe3e79c1f349474b98f06477bbdc009f.jpg", "couponType": "YES", "cardType": "NO", "groupType": "NO", "gpsX": 104.079935, "gpsY": 30.54066, "goodSayNum": 0, "midSayNum": 0, "badSayNum": 0 }, { "merchantID": "2845", "name": "目咖啡软件园C6店", "coupon": "凭QQ美食享咖啡8折优惠", "location": "四川省成都市高新区天华二路219号天府软件园C区6号楼1楼", "distance": "479m", "picUrl": "http://www.warmtel.com/igme_pic/33f7ab6e385143f097527d4507cabcbe.jpg", "couponType": "YES", "cardType": "NO", "groupType": "NO", "gpsX": 104.078242, "gpsY": 30.545434, "goodSayNum": 0, "midSayNum": 0, "badSayNum": 0 }, { "merchantID": "5326", "name": "九点国际酒店", "coupon": "网上预定成功入住可返现金", "location": "四川省成都市天府大道南段1号齐盛艺境[近世纪城会展中心]", "distance": "556m", "picUrl": "http://www.warmtel.com/igme_pic/c5721d159e63482b8a1d4dd9f70f9a03.jpg", "couponType": "YES", "cardType": "NO", "groupType": "NO", "gpsX": 104.077416, "gpsY": 30.53835, "goodSayNum": 1, "midSayNum": 0, "badSayNum": 0 }, { "merchantID": "2841", "name": "布衣客栈软件园店", "coupon": "酒店消费券预订酒店返现金", "location": "四川省成都市高新区世纪城南路399号[近天府软件园C区]", "distance": "660m", "picUrl": "http://www.warmtel.com/igme_pic/f8dc2d69a7b742eba4408bb72e510f5d.jpg", "couponType": "YES", "cardType": "YES", "groupType": "NO", "gpsX": 104.080515, "gpsY": 30.547937, "goodSayNum": 0, "midSayNum": 0, "badSayNum": 0 }, { "merchantID": "11798", "name": "茅台贵州液专卖店", "coupon": "购买茅台红酒3件以上再送1件", "location": "四川省成都市高新区中和镇姐儿堰路14号", "distance": "683m", "picUrl": "http://www.warmtel.com/igme_pic/df0a55009cea4b8ba2773278ffb3ff79.jpg", "couponType": "NO", "cardType": "NO", "groupType": "NO", "gpsX": 104.079227, "gpsY": 30.536175, "goodSayNum": 0, "midSayNum": 0, "badSayNum": 0 }, { "merchantID": "2842", "name": "巴国布衣软件园店", "coupon": "持光大银行信用卡享成都巴国布衣8.8折优惠,截止2012-12-31.", "location": "四川省成都市高新区世纪城南路399号", "distance": "683m", "picUrl": "http://www.warmtel.com/igme_pic/1f4781f9329b40218544fd4b7ec673c9.jpg", "couponType": "NO", "cardType": "YES", "groupType": "NO", "gpsX": 104.080254, "gpsY": 30.548117, "goodSayNum": 0, "midSayNum": 0, "badSayNum": 0 }, { "merchantID": "5325", "name": "香妃儿美容美体", "coupon": "38元享980元超值美胸丰胸套餐", "location": "四川省成都市高新区远大都市风景二期二号", "distance": "703m", "picUrl": "http://www.warmtel.com/igme_pic/26cfa2c850dd40cf9518d71ea55b687b.jpg", "couponType": "NO", "cardType": "NO", "groupType": "NO", "gpsX": 104.080344, "gpsY": 30.535779, "goodSayNum": 0, "midSayNum": 0, "badSayNum": 0 }, { "merchantID": "3718", "name": "锦咖啡", "coupon": "凭锦咖啡折扣券可享餐品8.5折,饮品7.5折,牛排6.8折优惠.\r\n\r\n1.该优惠有效期:截止至2012年12月31日;\r\n2.凭此券可以享受以下优惠:\r\n餐品8.5折\r\n饮品7.5折\r\n牛排6.8折\r\n(营业时间:09:30-23:30)\r\n\r\n展示此页即享优惠.", "location": "四川省成都市高新区天华路447-1号[近天府软件园B区]", "distance": "874m", "picUrl": "http://www.warmtel.com/igme_pic/7629ff4f8beb43d1bd0967baba46f6c6.jpg", "couponType": "YES", "cardType": "YES", "groupType": "NO", "gpsX": 104.078756, "gpsY": 30.549577, "goodSayNum": 3, "midSayNum": 0, "badSayNum": 0 }, { "merchantID": "2416", "name": "蜀国飘香远大店", "coupon": "享菜品8.8折优惠(酒水除外)", "location": "四川省成都市高新区远大都市风景商业街3号楼", "distance": "1041m", "picUrl": "http://www.warmtel.com/igme_pic/8f0e793995084f76a59cc789fb6f6c7e.jpg", "couponType": "NO", "cardType": "NO", "groupType": "NO", "gpsX": 104.077334, "gpsY": 30.533345, "goodSayNum": 0, "midSayNum": 0, "badSayNum": 0 }, { "merchantID": "3719", "name": "华庭茶府", "coupon": "100元享120元小包优惠", "location": "四川省成都市高新区天华路329号附1号[近天府软件园B区]", "distance": "1057m", "picUrl": "http://www.warmtel.com/igme_pic/1eeae0d361f54124bdd3b6600dcc6074.jpg", "couponType": "YES", "cardType": "YES", "groupType": "NO", "gpsX": 104.078705, "gpsY": 30.551274, "goodSayNum": 0, "midSayNum": 0, "badSayNum": 0 } ] }}
根据 JSON 的结果,首先新建几个类:
(1)TotalT 类该类包含 resultCode,resultInfo,info 的信息:
package com.scxh.listlayout.parsejson;/** * Created by antimage on 2016/1/4. */public class TotalT { private String resultCode; private String resultInfo; private InfoT info; public String getResultCode() { return resultCode; } public void setResultCode(String resultCode) { this.resultCode = resultCode; } public String getResultInfo() { return resultInfo; } public void setResultInfo(String resultInfo) { this.resultInfo = resultInfo; } public InfoT getInfo() { return info; } public void setInfo(InfoT info) { this.info = info; }}
(2)新建一个 InfoT 类包含 pageInfo,merchantKey:
package com.scxh.listlayout.parsejson;import java.util.List;/** * Created by antimage on 2016/1/4. */public class InfoT { private PageInfoT pageInfo; private List<MerchantKeyT> merchantKey; public List<MerchantKeyT> getMerchantKey() { return merchantKey; } public void setMerchantKey(List<MerchantKeyT> merchantKey) { this.merchantKey = merchantKey; } public PageInfoT getPageInfo() { return pageInfo; } public void setPageInfo(PageInfoT pageInfo) { this.pageInfo = pageInfo; }}
(3)新建一个 PageInfoT 类包含 pageInfo 的信息:
package com.scxh.listlayout.parsejson;import java.util.List;/** * Created by antimage on 2016/1/4. */public class PageInfoT { private String total; private String pageSize; private String lastPageNumber; private String nowPage; private String currNum; public String getTotal() { return total; } public void setTotal(String total) { this.total = total; } public String getPageSize() { return pageSize; } public void setPageSize(String pageSize) { this.pageSize = pageSize; } public String getLastPageNumber() { return lastPageNumber; } public void setLastPageNumber(String lastPageNumber) { this.lastPageNumber = lastPageNumber; } public String getNowPage() { return nowPage; } public void setNowPage(String nowPage) { this.nowPage = nowPage; } public String getCurrNum() { return currNum; } public void setCurrNum(String currNum) { this.currNum = currNum; }}
(4)新建一个 MerchantKeyT 类包含 merchantKey 的信息,只解析其中需要的部分:
package com.scxh.listlayout.parsejson;/** * Created by antimage on 2016/1/4. */public class MerchantKeyT { private String name; private String coupon; private String location; private String distance; private String picUrl; private String couponType; private String cardType; private String groupType; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getCoupon() { return coupon; } public void setCoupon(String coupon) { this.coupon = coupon; } public String getLocation() { return location; } public void setLocation(String location) { this.location = location; } public String getDistance() { return distance; } public void setDistance(String distance) { this.distance = distance; } public String getPicUrl() { return picUrl; } public void setPicUrl(String picUrl) { this.picUrl = picUrl; } public String getCouponType() { return couponType; } public void setCouponType(String couponType) { this.couponType = couponType; } public String getCardType() { return cardType; } public void setCardType(String cardType) { this.cardType = cardType; } public String getGroupType() { return groupType; } public void setGroupType(String groupType) { this.groupType = groupType; }}
MainActivity.java :
package com.scxh.listlayout;import android.os.AsyncTask;import android.os.Bundle;import android.support.v7.app.ActionBar;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.Toolbar;import android.view.LayoutInflater;import android.view.View;import android.widget.ProgressBar;import android.widget.Toast;import com.google.gson.Gson;import com.loopj.android.http.AsyncHttpClient;import com.loopj.android.http.TextHttpResponseHandler;import com.scxh.listlayout.parsejson.InfoT;import com.scxh.listlayout.parsejson.MerchantKeyT;import com.scxh.listlayout.parsejson.TotalT;import com.scxh.slider.library.Indicators.PagerIndicator;import com.scxh.slider.library.SliderLayout;import com.scxh.slider.library.SliderTypes.TextSliderView;import com.warmtel.android.xlistview.XListView;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;import java.text.SimpleDateFormat;import java.util.HashMap;import java.util.List;import cz.msebera.android.httpclient.Header;public class MainActivity extends AppCompatActivity { private String url = "http://192.168.1.160/json/around"; private XListView listView; private MyAdapter adapter; private AsyncHttpClient asyncHttpClient = new AsyncHttpClient(); private ProgressBar progressBar;// private SwipeRefreshLayout swipeRefreshLayout; private SliderLayout sliderLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); initActionBar(); listView = (XListView)findViewById(R.id.listView); progressBar = (ProgressBar)findViewById(R.id.progressbar); // initSwipeRefresh(); initListHeader(); // 使用异步下载网络资源 // new DownloadTask().execute(url); // 使用第三方的开源框架下载资源 getAsyncDataList(); // XListView 的点击事件 clickForXListView(); adapter = new MyAdapter(this); listView.setAdapter(adapter); listView.setEmptyView(progressBar); } /** * ListView 分为 3 部分: 头部 ListHeader, 内容部分(我们常用的部分) ContentView,底部 FooterView * 其中:头部,底部一般不可见 */ private void initListHeader() { View sliderHeaderView = LayoutInflater.from(this).inflate(R.layout.silderl_layout,null); sliderLayout = (SliderLayout) sliderHeaderView.findViewById(R.id.slider_imager); listView.addHeaderView(sliderHeaderView); HashMap<String,String> sliderList = getData(); for(String key : sliderList.keySet()){ String url = sliderList.get(key); TextSliderView textSliderView = new TextSliderView(this); textSliderView.description(key); textSliderView.image(url); textSliderView.setScaleType(TextSliderView.ScaleType.CenterCrop); sliderLayout.addSlider(textSliderView); } sliderLayout.setPresetIndicator(SliderLayout.PresetIndicators.Right_Bottom); } /* 此部分的内容为google自带的刷新设置 *//* private void initSwipeRefresh() { swipeRefreshLayout = (SwipeRefreshLayout)findViewById(R.id.slider_layout_content); swipeRefreshLayout.setColorSchemeResources( android.R.color.holo_blue_dark, android.R.color.holo_green_dark, android.R.color.holo_orange_dark, android.R.color.holo_red_dark ); }*/ /** * XListView 的点击事件 */ private void clickForXListView(){ // 默认是 false,这里改为 true listView.setPullLoadEnable(true); listView.setXListViewListener(new XListView.IXListViewListener() { @Override public void onRefresh() { // 此处模拟加载的状态 forLittleTime(); } @Override public void onLoadMore() { // 此处模拟加载的状态 forLittleTime(); } }); } /** * 模网络的加载工作,(睡眠) */ private void forLittleTime(){ new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... params) { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); getAsyncDataList(); } }.execute(); } /** * 利用第三方开源包下载 */ public void getAsyncDataList() { asyncHttpClient.get(url, new TextHttpResponseHandler() { @Override public void onFailure(int i, Header[] headers, String s, Throwable throwable) { Toast.makeText(MainActivity.this, "加载失败", Toast.LENGTH_SHORT).show(); } @Override public void onSuccess(int i, Header[] headers, String s) { forGson(s); Toast.makeText(MainActivity.this, "加载成功", Toast.LENGTH_SHORT).show(); listView.setRefreshTime( new SimpleDateFormat("HH:mm:ss").format(System.currentTimeMillis())); // 下载成功之后停止刷新(减少内存消耗) listView.stopRefresh(); // 下载成功后停止下载(减少内存消耗) listView.stopLoadMore(); // swipeRefreshLayout..setRefreshing(false); // 停止刷新 } }); } /** * 给 ActionBar 设置图标 */ private void initActionBar(){ final ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setHomeAsUpIndicator(R.drawable.btn_back); actionBar.setDisplayHomeAsUpEnabled(true); } } /* ListView 的头部加载数据来源 */ private HashMap<String,String> getData(){ HashMap<String,String> http_url_maps = new HashMap<String, String>(); http_url_maps.put("习近平接受八国新任驻华大使递交国书", "http://img.my.csdn.net/uploads/201407/26/1406383291_6518.jpg"); http_url_maps.put("天津港总裁出席发布会", "http://img.my.csdn.net/uploads/201407/26/1406383290_9329.jpg"); http_url_maps.put("瑞海公司从消防鉴定到安评一路畅通无阻", "http://img.my.csdn.net/uploads/201407/26/1406383290_1042.jpg"); http_url_maps.put("Airbnb高调入华 命运将如Uber一样吗?", "http://img.my.csdn.net/uploads/201407/26/1406383275_3977.jpg"); return http_url_maps; } /** * 从网络读取信息(异步) */ private class DownloadTask extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... params) { String str = params[0]; HttpURLConnection conn = null; BufferedReader br = null; InputStream is = null; try { URL url = new URL(str); conn = (HttpURLConnection)url.openConnection(); conn.setRequestMethod("GET"); conn.setDoInput(true); conn.setConnectTimeout(5000); conn.connect(); if(conn.getResponseCode() == 200){ is = conn.getInputStream(); br = new BufferedReader(new InputStreamReader(is)); StringBuilder sb = new StringBuilder(""); String str1 = null; while ((str1 = br.readLine()) != null) { sb.append(str1); } return sb.toString(); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (br != null && is != null && conn != null) { try { br.close(); is.close(); conn.disconnect(); } catch (IOException e) { e.printStackTrace(); } } } return null; } @Override protected void onPostExecute(String forNet) { forGson(forNet); } } /** * 解析 JSON */ private void forGson(String str){ Gson gson = new Gson(); TotalT totalT = gson.fromJson(str, TotalT.class); String resultCode = totalT.getResultCode(); String resultInfo = totalT.getResultInfo(); // Log.d("============", "结果码: "+resultCode+", 结果信息:"+resultInfo); InfoT infoT = totalT.getInfo(); List<MerchantKeyT> merchantKeyTList = infoT.getMerchantKey(); adapter.setForMerchantKeyT(merchantKeyTList); } @Override protected void onDestroy() { if(sliderLayout !=null) { sliderLayout.stopAutoCycle(); sliderLayout = null; } super.onDestroy(); }}
MyAdapter.java :
package com.scxh.listlayout;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView;import com.scxh.listlayout.parsejson.MerchantKeyT;import com.squareup.picasso.Picasso;import java.util.ArrayList;import java.util.List;/** * Created by scxh on 2016/1/5. */public class MyAdapter extends BaseAdapter { // 定义两种状态 private static final int STATUS_1 = 0; private static final int STATUS_2 = 1; private LayoutInflater inflater; private Context context; // 初始化,不然会有空指针 private List<MerchantKeyT> list = new ArrayList<>(); public MyAdapter(Context context){ inflater = LayoutInflater.from(context); this.context = context; } /** * 把参数传递到 MyAdapter 中 */ public void setForMerchantKeyT(List<MerchantKeyT> merchantKeyTList) { list = merchantKeyTList; notifyDataSetChanged(); } @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } /** * 返回两种状态的列表,一种是竖直状态,一种是水平状态 */ @Override public int getViewTypeCount() { return 2; } @Override public int getItemViewType(int position) { MerchantKeyT merchantKeyT = (MerchantKeyT)getItem(position); // 根据券的类型选择显示列表的状态 if (merchantKeyT.getCardType().equalsIgnoreCase("YES")){ return STATUS_2; } else { return STATUS_1; } } @Override public View getView(int position, View convertView, ViewGroup parent) { if (getItemViewType(position) == STATUS_2) { return getSecondView(position, convertView, parent); } else { return getFirstView(position, convertView, parent); } } public View getFirstView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; if (convertView == null) { // 一级优化 convertView = inflater.inflate(R.layout.item, parent, false); // 二级优化 viewHolder = new ViewHolder(); viewHolder.iconImg = (ImageView)convertView.findViewById(R.id.imageView); viewHolder.titleTxt = (TextView)convertView.findViewById(R.id.title); viewHolder.cardImg = (ImageView)convertView.findViewById(R.id.image_card); viewHolder.groupImg = (ImageView)convertView.findViewById(R.id.image_group); viewHolder.ticketImg = (ImageView)convertView.findViewById(R.id.image_ticket); viewHolder.contentTxt = (TextView)convertView.findViewById(R.id.content); viewHolder.addressTxt = (TextView)convertView.findViewById(R.id.address); viewHolder.distanceTxt = (TextView)convertView.findViewById(R.id.distance); convertView.setTag(viewHolder); } viewHolder = (ViewHolder) convertView.getTag(); MerchantKeyT merchantKeyT = (MerchantKeyT)getItem(position); Picasso.with(context).load(merchantKeyT.getPicUrl()).into(viewHolder.iconImg); viewHolder.titleTxt.setText(merchantKeyT.getName()); viewHolder.contentTxt.setText(merchantKeyT.getCoupon()); viewHolder.addressTxt.setText(merchantKeyT.getLocation()); viewHolder.distanceTxt.setText(merchantKeyT.getDistance()); if(merchantKeyT.getCardType().equalsIgnoreCase("YES")){ viewHolder.cardImg.setVisibility(View.VISIBLE); }else{ viewHolder.cardImg.setVisibility(View.GONE); } if(merchantKeyT.getGroupType().equalsIgnoreCase("YES")){ viewHolder.groupImg.setVisibility(View.VISIBLE); }else{ viewHolder.groupImg.setVisibility(View.GONE); } if(merchantKeyT.getCouponType().equalsIgnoreCase("YES")){ viewHolder.ticketImg.setVisibility(View.VISIBLE); }else{ viewHolder.ticketImg.setVisibility(View.GONE); } return convertView; } public View getSecondView(int position, View convertView, ViewGroup parent) { ViewHolderTwo viewHolderTwo; if (convertView == null) { convertView = inflater.inflate(R.layout.item_second, parent, false); viewHolderTwo = new ViewHolderTwo(); viewHolderTwo.iconImg_1 = (ImageView)convertView.findViewById(R.id.image_card_second_1); viewHolderTwo.iconImg_2 = (ImageView)convertView.findViewById(R.id.image_card_second_2); viewHolderTwo.iconImg_3 = (ImageView)convertView.findViewById(R.id.image_card_second_3); convertView.setTag(viewHolderTwo); } viewHolderTwo = (ViewHolderTwo) convertView.getTag(); MerchantKeyT merchantKeyT = (MerchantKeyT)getItem(position); Picasso.with(context).load(merchantKeyT.getPicUrl()).into(viewHolderTwo.iconImg_1); Picasso.with(context).load(merchantKeyT.getPicUrl()).into(viewHolderTwo.iconImg_2); Picasso.with(context).load(merchantKeyT.getPicUrl()).into(viewHolderTwo.iconImg_3); return convertView; } class ViewHolder { ImageView iconImg; TextView titleTxt; ImageView cardImg; ImageView groupImg; ImageView ticketImg; TextView contentTxt; TextView addressTxt; TextView distanceTxt; } class ViewHolderTwo { ImageView iconImg_1; ImageView iconImg_2; ImageView iconImg_3; }}
所需的 XML 文件:
content_main.xml 使用了 XListView:
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/white" android:paddingBottom="5dp" android:paddingLeft="5dp" android:paddingRight="5dp" android:paddingTop="5dp" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context="com.scxh.listlayout.MainActivity" tools:showIn="@layout/activity_main"> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"> <com.warmtel.android.xlistview.XListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent" android:divider="@android:color/white" android:dividerHeight="5dp" /> <ProgressBar android:id="@+id/progressbar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" /> </FrameLayout></RelativeLayout>
intem.xml 定义每个列表项的样式:
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="83dp" android:paddingBottom="3dp" android:paddingLeft="5dp" android:paddingRight="6dp" android:paddingTop="5dp" android:background="#96969696"> <ImageView android:id="@+id/imageView" android:layout_width="80dp" android:layout_height="80dp" android:src="@drawable/ic_launcher" /> <TextView android:id="@+id/title" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="8dp" android:layout_marginTop="2dp" android:layout_toRightOf="@id/imageView" android:singleLine="true" android:text="title" android:textSize="16sp" /> <ImageView android:id="@+id/image_ticket" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" android:layout_marginTop="2dp" android:src="@drawable/near_ticket" /> <ImageView android:id="@+id/image_group" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="2dp" android:layout_toLeftOf="@id/image_ticket" android:src="@drawable/near_group" /> <ImageView android:id="@+id/image_card" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="2dp" android:layout_toLeftOf="@id/image_group" android:src="@drawable/near_card" /> <TextView android:id="@+id/content" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/title" android:layout_toRightOf="@id/imageView" android:paddingLeft="8dp" android:singleLine="true" android:text="189元每个人" android:textColor="#f00" android:textSize="14sp" /> <TextView android:id="@+id/distance" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:drawableLeft="@drawable/info_map" android:text="0.5km" /> <TextView android:id="@+id/address" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:paddingLeft="8dp" android:layout_toLeftOf="@id/distance" android:layout_toRightOf="@id/imageView" android:ellipsize="end" android:singleLine="true" android:text="西安南路" android:textSize="12sp" /></RelativeLayout>
item_second.xml (横着显示的图片):
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="83dp" android:paddingBottom="3dp" android:paddingLeft="5dp" android:paddingRight="6dp" android:paddingTop="3dp" android:orientation="horizontal" android:background="#96969696"> <ImageView android:id="@+id/image_card_second_1" android:layout_width="80dp" android:layout_height="80dp" android:layout_weight="1" android:layout_marginTop="2dp" android:src="@drawable/near_card" /> <ImageView android:id="@+id/image_card_second_2" android:layout_width="80dp" android:layout_height="80dp" android:layout_weight="1" android:layout_marginTop="2dp" android:src="@drawable/near_card" /> <ImageView android:id="@+id/image_card_second_3" android:layout_width="80dp" android:layout_height="80dp" android:layout_weight="1" android:layout_marginTop="2dp" android:src="@drawable/near_card" /></LinearLayout>
silderl_layout.xml :
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <com.scxh.slider.library.SliderLayout android:id="@+id/slider_imager" android:layout_width="match_parent" android:layout_height="200dp" /></RelativeLayout>
网络访问权限:
<uses-permission android:name="android.permission.INTERNET" />
使用了 google 提供的 SwipeRefreshLayout 刷新的 content_main.xml 在 MainActivity.java 已经注释掉了:
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/white" android:paddingBottom="5dp" android:paddingLeft="5dp" android:paddingRight="5dp" android:paddingTop="5dp" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context="com.scxh.listlayout.MainActivity" tools:showIn="@layout/activity_main"> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/slider_layout_content" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent" android:divider="@android:color/white" android:dividerHeight="5dp" /> <ProgressBar android:id="@+id/progressbar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" /> </android.support.v4.widget.SwipeRefreshLayout> </FrameLayout></RelativeLayout>
- JSON,ListView AsyncHttpClient 等第三方包的综合实应用
- listview的综合应用
- AsyncHttpClient对json的读取操作
- 新闻客户端(AsyncHttpClient和SmartImageView的综合使用)
- AsyncHttpClient和SmartImageView的综合使用--新闻客户端
- 新闻客户端(AsyncHttpClient和SmartImageView的综合使用
- AsyncHttpClient和SmartImageView的综合使用--新闻客户端
- 使用开源框架AsyncHttpClient进行Json的Post请求
- AsyncHttpClient RequestParams怎么封装下面格式的json
- Json+jquery+asp.net 综合应用实例
- MSHFlexGrid的综合应用
- 通知的综合应用
- 循环的综合应用
- CSS的综合应用
- Web的综合应用
- AngularJs的综合应用
- NSWorkspace的综合应用
- json的综合使用(一)
- mysql多表合并分页
- iOS拨打电话(三种方法)
- ListView 请求(加载)可视区域Item的图片
- std::upper_bound
- 面向接口编程详解(二)——编程实例
- JSON,ListView AsyncHttpClient 等第三方包的综合实应用
- 高斯消元算法实现(Java)
- 当用eclipse远程调试tomcat上的应用
- 面向接口编程详解(三)——模式研究
- 穷人的语义处理工具箱之一:语义版Jaccard
- Python 图形处理库PIL批量修改图片大小和格式
- 【后会有期】
- odroid article
- Business Intelligence——SSIS项目从创建到部署的简单总结(一)