ListView加载网络数据和图片

2013-09-25 00:08:10|  分类: 默认分类 |  标签:android  |举报|字号 订阅

 
 
如,从服务器端获得商品名称、价格、简介和图片,加载到Android ListView中。又如加载微博内容。

 
需了解熟悉:
1、ListView行布局,排版,getView方法
这个案例可以说是实现ListView图文混排的网络版。关于在ListView中实现排版的方法,参      考:http://blog.163.com/ppy2790@126/blog/static/1032422412013731115643829/
2、异步任务的实现,Handler+Thread , AsyncTask
3、JSON解析方式
 
 
实现思路:
1、异步加载服务器访问商品数据(json格式)
      封装网络访问的方法
2、json数据转为Adapter数据(List<Map<String,Object>>)
     封装数据转换的方法
3、Adapter先加载文本内容信息
     使用AsyncTask加载网络访问的集合数据
     加载ListView中的文本信息
4、json数据中有图片信息(路径),异步读取加载图片
    采用接口回调的方法,加载图片信息(Handler+Thread)
 

public class HttpUtil {

public static final String BASE_URL = "http://10.0.2.2:8080/jsontest/servlet/ProductServlet";

public static final String IMG_URL = "http://10.0.2.2:8080/jsontest/upload/";

public static HttpClient httpClient = new DefaultHttpClient();

// post方法访问服务器,返回json字符串

public static String getRequest(String url){

String result = null;

HttpGet httpGet = new HttpGet(url);

try {

HttpResponse httpResponse = httpClient.execute(httpGet);

if (httpResponse.getStatusLine().getStatusCode() == 200) {

result = EntityUtils.toString(httpResponse.getEntity(),"utf-8");

}

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return result;

}

// 字符串转成集合数据

public static void resultString2List(List<Map<String ,Object>> list, String str,String title) {

try {

JSONObject jsonObject = new JSONObject(str);

JSONArray jsonArray = jsonObject.getJSONArray(title);

for (int i = 0; i < jsonArray.length(); i++) {

JSONObject jsonObject2 = jsonArray.getJSONObject(i);

Map<String ,Object> map = new HashMap<String, Object>();

Iterator<String> iterator = jsonObject2.keys();

while (iterator.hasNext()) {

String key = iterator.next();

Object value = jsonObject2.get(key);

map.put(key, value);

}

list.add(map);

}

} catch (JSONException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

// post方法访问服务器,返回集合数据

public static List<Map<String,Object>> getRequest2List(String url,String title){

List<Map<String,Object>> list = new ArrayList<Map<String ,Object>>();

resultString2List(list, url, title);

return list;

}

// get方法访问服务器,返回json字符串

public static String postRequest(String url, Map<String,String> rawParams) throws Exception{

HttpPost post = new HttpPost(url);

List<NameValuePair> params = new ArrayList<NameValuePair>();

for (String key:rawParams.keySet()) {

params.add(new BasicNameValuePair(key, rawParams.get(key)));

}

post.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));

HttpResponse httpResponse = httpClient.execute(post);

if(httpResponse.getStatusLine().getStatusCode() == 200){

String result = EntityUtils.toString(httpResponse.getEntity());

return result;

}

return null;

}

//post访问的方法,还可继续封装,略。。。

}

异步任务,得到网络json转换的集合数据,并在完成后加载到listview中(onPostExcute方法中执行)

public class MyTask extends AsyncTask<String, Void, List<Map<String,Object>>>{

@Override

protected void onPreExecute() {

// TODO Auto-generated method stub

super.onPreExecute();

progressDialog.show();

}

@Override

protected void onPostExecute(List<Map<String, Object>> result) {

// TODO Auto-generated method stub

super.onPostExecute(result);

adapter.setData(result);

listview.setAdapter(adapter);

adapter.notifyDataSetChanged();

progressDialog.dismiss();

}

@Override

protected List<Map<String, Object>> doInBackground(String... params) {

// TODO Auto-generated method stub

List<Map<String,Object>> list ;

String str = HttpUtil.getRequest(params[0]);

list = HttpUtil.getRequest2List(str, "products");

return list;

}

}

 
OnCreate()方法中启动异步任务:

progressDialog = new ProgressDialog(this);

progressDialog.setTitle("正在下载....");

adapter = new MyAdapter(this);

new MyTask().execute(HttpUtil.BASE_URL);

 
Adapter:
 

public class MyAdapter extends BaseAdapter{

private Context context;

private LayoutInflater layoutInflater;

private List<Map<String,Object>> list;

public MyAdapter(Context context) {

this.context = context;

layoutInflater = layoutInflater.from(context);

}

public List getData(){

return list;

}

public void setData(List<Map<String,Object>> data){

this.list = data;

}

@Override

public int getCount() {

// TODO Auto-generated method stub

return list.size();

}

@Override

public Object getItem(int position) {

// TODO Auto-generated method stub

return list.get(position);

}

@Override

public long getItemId(int position) {

// TODO Auto-generated method stub

return position;

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

// TODO Auto-generated method stub

View view = null;

final ViewHolder viewHolder;

if (convertView == null ) {

convertView = layoutInflater.inflate(R.layout.item, null);

viewHolder = new ViewHolder();

viewHolder.id = (TextView)convertView.findViewById(R.id.textView1);

viewHolder.name = (TextView)convertView.findViewById(R.id.textView2);

viewHolder.address = (TextView)convertView.findViewById(R.id.textView3);

viewHolder.img = (ImageView)convertView.findViewById(R.id.imageView1);

convertView.setTag(viewHolder);

}else{

viewHolder = (ViewHolder)convertView.getTag();

}

viewHolder.id.setText(list.get(position).get("sid").toString());

viewHolder.name.setText(list.get(position).get("name").toString());

viewHolder.address.setText(list.get(position).get("addr").toString());

//接口回调的方法,完成图片的读取;

DownImage downImage = newDownImage(HttpUtil.IMG_URL+list.get(position).get("pic").toString()+".jpg");

downImage.loadImage(new ImageCallBack() {

@Override

public void getDrawable(Drawable drawable) {

// TODO Auto-generated method stub

viewHolder.img.setImageDrawable(drawable);

}

});

return convertView;

}

}

public class ViewHolder{

ImageView img;

TextView id;

TextView name;

TextView address;

}

 
 
异步加载图片的类:

public class DownImage {

public String image_path;

public DownImage(String image_path) {

this.image_path = image_path;

}

public void loadImage(final ImageCallBack callBack){

final Handler handler = new Handler(){

@Override

public void handleMessage(Message msg) {

// TODO Auto-generated method stub

super.handleMessage(msg);

Drawable drawable = (Drawable) msg.obj;

callBack.getDrawable(drawable);

}

};

new Thread(new Runnable() {

@Override

public void run() {

// TODO Auto-generated method stub

try {

Drawable drawable = Drawable.createFromStream(new URL(image_path).openStream(), "");

Message message = Message.obtain();

message.obj = drawable;

handler.sendMessage(message);

} catch (MalformedURLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}).start();

}

public interface ImageCallBack{

public void getDrawable(Drawable drawable);

}

}

listview加载网络图片的更多相关文章

  1. 详解ListView加载网络图片的优化,让你轻松掌握!

    详解ListView加载网络图片的优化,让你轻松掌握! 写博客辛苦了,转载的朋友请标明出处哦,finddreams(http://blog.csdn.net/finddreams/article/de ...

  2. 详解ListView加载网络图片的优化

    我们来了解一些ListView在加载大量网络图片的时候存在的常见问题: 1.性能问题,ListView的滑动有卡顿,不流畅,造成非常糟糕的用户体验. 2.图片的错位问题. 3.图片太大,加载Bitma ...

  3. [android]完美的解决方案ListView加载网络图片反弹问题

    为什么 先说为什么有照片反弹. 使用convertView对ListView的每一个item优化,item的复用能够有效减少内存的占用.使ListView滑动更为流畅. 但会带来一个问题,当最顶部的i ...

  4. (BUG已修改,最优化)安卓ListView异步加载网络图片与缓存软引用图片,线程池,只加载当前屏之说明

    原文:http://blog.csdn.net/java_jh/article/details/20068915 迟点出更新的.这个还有BUG.因为软引应不给力了.2.3之后 前几天的原文有一个线程管 ...

  5. wemall app商城源码Android之ListView异步加载网络图片(优化缓存机制)

    wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享wemall app商城源码Android之L ...

  6. Android中用双缓存技术,加载网络图片

    最近在学校参加一个比赛,写的一个Android应用,里面要加载大量的网络图片,可是用传统的方法图片一多就会造成程序出现内存溢出而崩溃.因为自己也在学习中,所以看了很多博客和视频,然后参照这些大神的写源 ...

  7. Gilde加载网络图片(一)

    前两天 一个朋友要在本地加载几M的大图 用于用户滚动查看.按照思路 是压缩后加载显示但是这样会不清晰, 其实gilde用来加载图片 很牛掰 于是了解一下 下面贴上两个工具类: package com. ...

  8. Afianl加载网络图片(续)

    上一篇已经讲了如何利用Afianl加载网络图片和下载文件,这篇文章将继续讲解使用Afinal加载网络图片的使用,主要结合listview的使用: 看效果图: listview在滑动过程中没用明显卡顿, ...

  9. 【WPF】wpf image控件加载网络图片不显示问题,

    1.加载网络图片到内存system.drawing.image对象中2.内存中的image 转Bitmap 再转适合system.windows.controls.image 的BitmapImage ...

随机推荐

  1. Parallel并行编程

    Parallel并行编程 Parallel并行编程可以让我们使用极致的使用CPU.并行编程与多线程编程不同,多线程编程无论怎样开启线程,也是在同一个CPU上切换时间片.而并行编程则是多CPU核心同时工 ...

  2. load average[zhuan]

    load average值的含义 单核处理器 假设我们的系统是单CPU单内核的,把它比喻成是一条单向马路,把CPU任务比作汽车.当车不多的时候,load <1:当车占满整个马路的时候 load= ...

  3. js阻止事件冒泡的方法

    /********************************************js方法*************************************************** ...

  4. Strtus2工作流程及原理

    从上图可以看出,一个请求在Struts2 框架中的处理大概分为以下几个步骤:1.客户端初始化一个指向Servlet 容器(例如Tomcat)的请求:2.这个请求经过一系列的过滤器(Filter)(这些 ...

  5. 锁机制与原子操作 <第四篇>

    一.线程同步中的一些概念 1.1临界区(共享区)的概念 在多线程的环境中,可能需要共同使用一些公共资源,这些资源可能是变量,方法逻辑段等等,这些被多个线程共用的区域统称为临界区(共享区),临界区的资源 ...

  6. HtmlAttribute HTML属性处理类

    HtmlAttribute 在HtmlAgilityPack扮演的是一个HTML代码属性的容器,同时提供了用于处理HTML属性的一些功能. 一.属性 int Line { get; } 获取文档中的此 ...

  7. Eclipse 快捷键总结

    导包:alt+/ctrl+shift+o (alt+/) 全局文件搜索:ctrl+shift+r 全局关键词搜索:ctrl+h 查看解决方案:ctrl+1 自动补全:abcdefghjklmnopqr ...

  8. Zookeeper 4、Zookeeper开发

    1.登录Zookeeper客户端 #通过zkCli.sh可以登录到Zookeeper $ cd /usr/local/zookeeper-3.4.6/bin $ ./zkCli.sh #如果显示下面这 ...

  9. Oracle使用NLSSORT函数实现汉字的排序

    1).按拼音首字母排序 SELECT * FROM T_TABLE ORDER BY NLSSORT(NAME, 'NLS_SORT=SCHINESE_PINYIN_M'); 2).按笔画排序SELE ...

  10. paip.c++ qt 图片处理 检测损坏的图片

    paip.c++ qt 图片处理 检测损坏的图片 作者Attilax ,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog.csdn.net ...