【ListViewJSON】【工具类的功能与实现】

接上一篇博客,这篇博客的重点是分析listviewjson项目中的工具类的功能,以及如何更好地使用这套工具。

项目源码结构图:

假设现在有一个新的项目,同样是解析json数据,并将其显示到listview中。

那么现在考虑一下如何在两个项目之间进行移植。

首先com.demo.app.common是可以直接进行移植的。

那么需要重新写的就是1、bean 2、adapter 3、以及所有和获取列表数据有关、将数据加载到listvie文中有关的类。

MainActivity中通过

NewsList list = appContext.getNewsList();

获取列表数据。

而再看appContext中的getNewsList()方法:

public NewsList getNewsList() throws AppException {
        NewsList list = null;
        String key = "newslist_";
        if (isNetworkConnected() && !isReadDataCache(key)) {
            try {
                list = ApiClient.getNewsList(this);
            } catch (AppException e) {
                list = (NewsList) readObject(key);
                if (list == null)
                    throw e;
            }
        } else {
            list = (NewsList) readObject(key);
            if (list == null)
                list = new NewsList();
        }
        return list;
    }

使用的是ApiClient.getNewsList()方法,注意的是ApiClient的getNewsList是一个类方法,具体如下:

public static NewsList getNewsList(AppContext appContext)
            throws AppException {
        String newUrl = URLs.NEWS_LIST;
        try {

            System.out.println("获取新闻列表:" + newUrl);
            System.out.println(http_get(appContext,newUrl));
            return NewsList.parse(StringUtils.toJSONArray(http_get(appContext,
                    newUrl)));
        } catch (Exception e) {

            System.out.println(e);
            if (e instanceof AppException)
                throw (AppException) e;
            throw AppException.network(e);
        }
    }

分析ApiClient.getNewsList,可以看出它是先通过http_get获取一个字符串:

private static String http_get(AppContext appContext, String url)
            throws AppException {
        // System.out.println("get_url==> "+url);
        String cookie = getCookie(appContext);
        String userAgent = getUserAgent(appContext);
        HttpClient httpClient = null;
        GetMethod httpGet = null;
        String responseBody = "";
        int time = 0;
        do {
            try {
                httpClient = getHttpClient();
                httpGet = getHttpGet(url, cookie, userAgent);
                int statusCode = httpClient.executeMethod(httpGet);
                if (statusCode != HttpStatus.SC_OK) {
                    throw AppException.http(statusCode);
                }
                responseBody = httpGet.getResponseBodyAsString();
                // System.out.println("XMLDATA=====>"+responseBody);
                break;
            } catch (HttpException e) {
                time++;
                if (time < RETRY_TIME) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e1) {
                    }
                    continue;
                }
                // 发生致命的异常,可能是协议不对或者返回的内容有问题
                e.printStackTrace();
                throw AppException.http(e);
            } catch (IOException e) {
                time++;
                if (time < RETRY_TIME) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e1) {
                    }
                    continue;
                }
                // 发生网络异常
                // e.printStackTrace();
                throw AppException.network(e);
            } finally {
                // 释放连接
                httpGet.releaseConnection();
                httpClient = null;
            }
        } while (time < RETRY_TIME);

        responseBody = responseBody.replaceAll("\\p{Cntrl}", "");
        return responseBody;
    }

在通过StringUtils.toJSONArray将其转换为一个json数组:

public static JSONArray toJSONArray(String json) throws JSONException {
        if (!isEmpty(json)) {
            // if (json.indexOf("[") == 0) {
            // json = json.substring(1, json.length());
            // }
            // if (json.lastIndexOf("]") == json.length()) {
            // json = json.substring(0, json.length() - 1);
            // }
        }
        return new JSONArray(json);
    }

最后通过NewsList的parse将json数据放到NewsList中。

public static NewsList parse(JSONArray obj) throws IOException,
            AppException, JSONException {
        NewsList newslist = new NewsList();
        if (null != obj) {
            newslist.newsCount = obj.length();
            for (int i = 0; i < obj.length(); i++) {
                JSONObject newsJson = obj.getJSONObject(i);
                News news = new News();
                news.setId(newsJson.getString("ID"));
                news.setTitle(newsJson.getString("Title"));
                news.setFirstPicUrl(newsJson.getString("FirstPicUrl"));
                news.setPublishTime(newsJson.getString("PublishTime"));
                newslist.newslist.add(news);
            }
        }
        return newslist;
    }
}

在这里可以看一下,NewsList和News的成员变量。

News的成员变量。

public class News extends Base {
    private String title;
    private String publishTime;
    private String id;
    private String firstPicUrl;

NewsList的成员变量:

public class NewsList extends Base {
    private int catalog;
    private int pageSize;
    private int newsCount;
    private List<News> newslist = new ArrayList<News>();

最后看一下adapter如何将newslist放到listview中,重点就是getView方法。

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        if (convertView == null) {
            holder = new ViewHolder();
            convertView = inflater.inflate(R.layout.listview_item, null);
            holder.title = (TextView) convertView
                    .findViewById(R.id.textview_home_listview_title);
            holder.time = (TextView) convertView
                    .findViewById(R.id.textview_home_listview_time);
            holder.img = (ImageView) convertView
                    .findViewById(R.id.imageview_home_listview_thumb);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.title.setText(list.get(position).getTitle());
        holder.time.setText(list.get(position).getPublishTime());

        String imgURL = list.get(position).getFirstPicUrl();
        if (imgURL.endsWith("portrait.gif") || StringUtils.isEmpty(imgURL)) {
            holder.img.setImageResource(R.drawable.umeng_socialize_share_pic);
        } else {
            if (!imgURL.contains("http")) {
                imgURL = URLs.HTTP + URLs.HOST + "/" + imgURL;
            }
            bmpManager.loadBitmap(imgURL, holder.img);
        }
        return convertView;
    }

以上。

时间: 2024-10-15 06:41:40

【ListViewJSON】【工具类的功能与实现】的相关文章

在Java中Arrays工具类实现功能的六种方法

使用Arrays工具类,要先导入包即:import.java.util.Arrays 以下是实现六种功能的方法: 1.比较两个数组值是否相等: 结果为true.false.(布尔型不能比较) int []a={10,20,30}; int []b={10,20,30}; int []c={1,2,3}; boolean isEqual=Arrays.equals(a,b); System.out.println(isEqual); System.out.println(Arrays.equals

轻松把玩HttpClient之封装HttpClient工具类(七),新增验证码识别功能

这个HttpClientUtil工具类分享在GitHub上已经半年多的时间了,并且得到了不小的关注,有25颗star,被fork了38次.有了大家的鼓励,工具类一直也在完善中.最近比较忙,两个多月前的修改在今天刚修改测试完成,今天再次分享给大家. 验证码识别这项技术并不是本工具类的功能,而是通过一个开源的api来识别验证码的.这里做了一个简单的封装,主要是用来解决登陆时的验证码的问题.在线验证码识别官网:http://lab.ocrking.com/,github地址:https://githu

项目中js的工具类

js工具类的功能有: 1.去掉字符串前后空格 2.清空select 3.验证手机号 4.字符串转换int型数字 5.获取checkbox的选中的值 6.去掉左边的空白 7.去掉邮编的空白 源码如下: /** * 去掉字符串前后空格 * * @param str * @returns */ function trim(str){ return str.replace(/^(\s|\xA0)+|(\s|\xA0)+$/g, ''); } /** * 清空select * * @param selec

Java集合框架:Collections工具类

java.util.Collections工具类提供很多有用的方法,使得程序猿操作集合类的时候更加的方便容易,这些方法都是静态的.整个Collections工具类源码差不多有4000行,我们针对一些典型的方法进行阐述. 1. 调用一个空List,Set,Map public static final List EMPTY_LIST = new EmptyList<>(); public static final Map EMPTY_MAP = new EmptyMap<>(); p

java集合框架--工具类Collections

1.Collections概述 是针对集合操作的工具类. 2.Collection和Collections的区别? Collection:是单列集合的顶层接口,而Collections是针对集合操作的工具类. Collection有子接口List和Set,而Collections有对集合进行排序和二分查找的方法. 3.Collections工具类的功能 public static <T> void sort(List<T> list):默认情况下是对集合的自然排序. public

JEasyPoi 2.1.4 (Jeecg订制) 版本发布,Excel 和 Word 简易工具类

JEasyPoi 2.1.4 (jeecg订制)版本发布,EasyPoi Excel 和 Word 简易工具类 easypoi 功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板 语言(熟悉的表达式语法),完成以前复杂的写法     源码下载:  http://git.oschina.net/jeecg/jeasypoi EasyPoi的主要特点 1.设计精巧,使用简单

工具类:每次随机生成有销售库存有实际库存的1个店铺商品和对应的2个店铺商品sku

# coding:utf-8 # @fileName :2.每次随机生成有销售库存有实际库存的1个店铺商品和对应的2个店铺商品sku.py # @createTime :2020/4/4 10:33 # @author :hongjingsheng # @email :[email protected] # @software :PyCharm # 请从下一行开始编写脚本 from testcase.goodsAPI.goodsSave.createData.create_one_goods_o

[转载]Process工具类,提供设置timeout功能

FROM:http://segmentfault.com/blog/lidonghao/1190000000372535 在前一篇博文中,简单介绍了如何使用Process类来调用命令行的功能,那样使用Process会有一个很大的问题,就是可能会出现无限阻塞的情况,永远都无法返回结果.以下是Process的API说明,注意加粗的部分. ProcessBuilder.start() 和 Runtime.exec 方法创建一个本机进程,并返回 Process 子类的一个实例,该实例可用来控制进程并获得

MD5工具类,提供字符串MD5加密、文件MD5值获取(校验)功能

MD5工具类,提供字符串MD5加密(校验).文件MD5值获取(校验)功能 : package com.yzu.utils; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.security.MessageDigest; impor