• 【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;
        }

    以上。

  • 相关阅读:
    flex 连接mysql
    正确配置调试world wind on vs2008
    FLex调用servlet连接数据库
    c# 连接mysql并webservice数据
    ADF连接SOM
    转载加收藏关于OPENGL配置VS2008
    flex不能显示本地发布的地图
    Symbian专区
    asp.net控件开发基础學習
    控制网页大小
  • 原文地址:https://www.cnblogs.com/hikigaya-yukino/p/4178614.html
Copyright © 2020-2023  润新知