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>


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 牛皮屑怎么办ke靠成都银康 微信订阅号取消关注之后还在怎么办 腾讯新闻红包领取说帐号异常怎么办 计算机职弥报名没选模块怎么办 有人用我手机注册有赞了怎么办 一件代发别人的货被投诉了怎么办 淘宝极速退款后商家拒收快递怎么办 运费险退到天猫垫付账户了怎么办 淘宝卖家食品有问题该怎么办 美团外卖不要辣椒给放了怎么办 旺旺卖家拒收我的消息怎么办 淘宝清空购物车大奖到上限了怎么办 游戏无响应除了退出还能怎么办 淘宝给差评了卖家一直打电话怎么办 电脑说带宽问题无法观看视频怎么办 手机淘宝上的购买信息删除了怎么办 为什么支付宝有钱淘宝付不了怎么办 苹果平板电脑上的淘宝点不开怎么办 淘宝付了两次款只有一个订单怎么办 淘宝付款显示支付宝账号异常怎么办 手机老卡换新卡淘宝付不了款怎么办 淘宝买东西退款卖家拒绝退款怎么办 淘宝店铺收藏图片怎么点不了怎么办 手机淘宝显示用户被限制登录怎么办 淘宝设置登录密码原密码忘了怎么办 斑马智行淘宝号换没法登录了怎么办 淘宝卖家手机版显示宝贝不全怎么办 在电脑上登的淘宝账号退不了怎么办 淘宝买家退款不退货写假货怎么办 淘宝卖家已发布商品没货了怎么办 京东换货附近没有京东自提点怎么办 一直显示手机淘宝已停止运行怎么办 唯品会买了不可以退货的衣服怎么办 淘宝店卖东西邮费太贵怎么办 支付宝登录上去必须手机验证怎么办 支付宝里的钱被盗了怎么办 淘宝绑定的支付宝账号忘记了怎么办 支付宝绑定的微博账号忘记了怎么办 怎么知道自己的淘宝密码忘了怎么办 更换扣扣头像图片太大放不下怎么办 每次登入淘宝都要手机验证码怎么办