zoukankan      html  css  js  c++  java
  • 【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;
        }

    以上。

  • 相关阅读:
    线性代数思维导图——3.向量
    微分中值定理的基础题型总结
    构造函数
    Python课程笔记(七)
    0241. Different Ways to Add Parentheses (M)
    0014. Longest Common Prefix (E)
    0013. Roman to Integer (E)
    0011. Container With Most Water (M)
    0010. Regular Expression Matching (H)
    0012. Integer to Roman (M)
  • 原文地址:https://www.cnblogs.com/hikigaya-yukino/p/4178614.html
Copyright © 2011-2022 走看看