例子中用于解析Json的Gson请自己Google下载

主Activity:


package COM.Example.Main;

import java.util.HashMap;

import java.util.Iterator;

import java.util.LinkedList;

import java.util.List;

import java.util.Map;

import COM.Example.Main.R;

import COM.Example.Main.stringGetJson.User;

import android.app.Activity;

import android.app.ListActivity;

import android.os.AsyncTask;

import android.os.Bundle;

import android.view.Gravity;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.AbsListView;

import android.widget.AbsListView.OnScrollListener;

import android.widget.ArrayAdapter;

import android.widget.ImageView;

import android.widget.LinearLayout;

import android.widget.ListView;

import android.widget.ProgressBar;

import android.widget.TextView;

public class stringListActivity extends ListActivity {

    private MyAdapter mMyAdapter;

    private LinkedList<User> users = null;

    // 当前Activity中的ListView

    ListView listView = null;

    int lastItem = 0;

    LinearLayout loadingLayout = null;

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.foodlistactivity);

        listView = getListView();

        setLoadingLayout();

        new readTask().execute(null);

    }

    private final class MyAdapter extends ArrayAdapter<User> {

        public MyAdapter(Activity activity, List<User> newsList) {

            super(activity, 0, newsList);

        }

        private Map<Integer, View> viewMap = new HashMap<Integer, View>();

        @Override

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

            ViewHolder holder;

            View rowView = this.viewMap.get(position);

            if (rowView == null) {

                User user = users.get(position);

                LayoutInflater inflater = ((Activity) this.getContext())

                        .getLayoutInflater();

                holder = new ViewHolder();

                rowView = inflater

                        .inflate(R.layout.foodlistactivity_item, null);

                holder.mNameText = (TextView) rowView

                        .findViewById(R.id.foodItemUsername);

                holder.mPhoto = (ImageView) rowView

                        .findViewById(R.id.foodItemPic);

                rowView.setTag(holder);

                holder.mNameText.setText(user.Name);

                if (!holder.mPhoto.isDrawingCacheEnabled()) {

                    holder.mPhoto.setTag(user.Pic);

                    new downImageTask().execute(holder.mPhoto);

                    holder.mPhoto.setDrawingCacheEnabled(true);

                }

                viewMap.put(position, rowView);

            } else {

                holder = (ViewHolder) rowView.getTag();

            }

            return rowView;

        }

        public class ViewHolder {

            public TextView mNameText;

            public ImageView mPhoto;

        }

    }

    public void setLoadingLayout() {

        LinearLayout layout = new LinearLayout(this);

        layout.setOrientation(LinearLayout.HORIZONTAL);

        ProgressBar progressBar = new ProgressBar(this);
        progressBar.setPadding(0, 0, 15, 0);
        layout.addView(progressBar);
        TextView textView = new TextView(this);
        textView.setText("加载中...");
        textView.setGravity(Gravity.CENTER_VERTICAL);
        layout.addView(textView);
        layout.setGravity(Gravity.CENTER);
        loadingLayout = new LinearLayout(this);
        loadingLayout.addView(layout);
        loadingLayout.setGravity(Gravity.CENTER);
    }
    
    private class scrollListener implements OnScrollListener {
        @Override
        public void onScroll(AbsListView view, int firstVisibleItem,
                int visibleItemCount, int totalItemCount) {
            // 当listView中没有数据,或者数据超过100条,或者不是10的整数倍(即数据不足)时隐藏“更多”并取消onScroll事件的绑定
            if (mMyAdapter.getCount() >= 100 || mMyAdapter.getCount() % 10 > 0
                    || mMyAdapter.getCount() == 0) {
                listView.removeFooterView(loadingLayout);
                listView.setOnScrollListener(null);
            }
            lastItem = firstVisibleItem + visibleItemCount - 1;// 这里减一是因为有FootView
        }         @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            if (lastItem == mMyAdapter.getCount()
                    && scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
                // 进行翻页操作
                new scrollTask().execute(null);
            }         }
    }
    
    public class readTask extends AsyncTask<Object, Void, Void> {
    
        @Override
        protected Void doInBackground(Object... arg0) {
            users = new stringGetJson().getJson();
            return null;
        }         @Override
        protected void onPostExecute(Void result) {
            listView.addFooterView(loadingLayout);
            
            mMyAdapter = new MyAdapter(stringListActivity.this, users);
            setListAdapter(mMyAdapter);
            listView.setOnScrollListener(new scrollListener());
        }
    }     public class scrollTask extends AsyncTask<Object, Void, Void> {
        
        @Override
        protected Void doInBackground(Object... arg0) {
            for (Iterator iterator = new stringGetJson().getJson()
                    .iterator(); iterator.hasNext();) {
                User user = (User) iterator.next();
                users.add(user);
            }
            return null;
        }         @Override
        protected void onPostExecute(Void result) {
            mMyAdapter.notifyDataSetChanged();
        }
    }
}

Json数据来源(这里的例子中把json字符串直接写在代码中了,实际项目中需要改成从网络读取,例子中已经使用了多线程):


package COM.Example.Main;

import java.lang.reflect.Type;

import java.util.Iterator;

import java.util.LinkedList;

import android.database.MatrixCursor;

import android.widget.ListView;

import android.widget.TextView;

import com.google.gson.Gson;

import com.google.gson.reflect.TypeToken;

public class stringGetJson {

    

    // 设置临时ID,在项目中将被现实的id取代

    private int id = 0;

    

    public stringGetJson() {

        super();

    }

    //通过getJson方法从Json字符串获取User的列表

    public LinkedList<User> getJson() {

        String jsonData = "[{\"Name\":\"xinuxForJson1\",\"Pic\":\"http://www.qqjay.com/uploads/110414/1_234626_5.jpg\"},{\"Name\":\"xinuxForJson2\",\"Pic\":\"http://www.qqjay.com/uploads/110414/1_234626_3.jpg\"},{\"Name\":\"xinuxForJson3\",\"Pic\":\"http://www.qqjay.com/uploads/110414/1_234626_4.jpg\"},{\"Name\":\"xinuxForJson4\",\"Pic\":\"http://sucai.qqjay.com/fengmian/201104/tupian1/8.jpg\"},{\"Name\":\"xinuxForJson5\",\"Pic\":\"http://sucai.qqjay.com/fengmian/201104/tupian1/10.jpg\"},{\"Name\":\"xinuxForJson6\",\"Pic\":\"http://sucai.qqjay.com/fengmian/201104/tupian1/7.jpg\"},{\"Name\":\"xinuxForJson7\",\"Pic\":\"http://sucai.qqjay.com/fengmian/201104/tupian1/11.jpg\"},{\"Name\":\"xinuxForJson8\",\"Pic\":\"http://sucai.qqjay.com/fengmian/201104/tupian1/12.jpg\"},{\"Name\":\"xinuxForJson9\",\"Pic\":\"http://sucai.qqjay.com/fengmian/201104/tupian1/9.jpg\"},{\"Name\":\"xinuxForJson10\",\"Pic\":\"http://sucai.qqjay.com/fengmian/201104/tupian/7.jpg\"}]";

        Type listType = new TypeToken<LinkedList<User>>() {}.getType();

        Gson gson = new Gson();

        LinkedList<User> users = gson.fromJson(jsonData, listType);

        return users;

    }

    //为getJson提供了数据实体类

    final static class User {

        public String Name;

        public String Pic;

    }

}

图片下载AsyncTask


package COM.Example.Main;

import COM.Example.FunctionUtility.Download;
import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.widget.ImageView; public class downImageTask extends AsyncTask<ImageView, Void, Bitmap> {
    
    ImageView gView = null;
    @Override
    protected Bitmap doInBackground(ImageView... arg0) {
        gView = (ImageView)arg0[0];
        return Download.getBitmapFromUrl(gView.getTag().toString());
    }     @Override
    protected void onPostExecute(Bitmap result) {
        if(result != null){
        this.gView.setImageBitmap(result);
        }
        this.gView = null;
    }
}

网络图片下载类:

package COM.Example.FunctionUtility;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

public class Download {
    public static Bitmap getBitmapFromUrl(String imgUrl) {
        URL url;
        Bitmap bitmap = null;
        try {
            url = new URL(imgUrl);
            InputStream is = url.openConnection().getInputStream();
            BufferedInputStream bis = new BufferedInputStream(is);
            bitmap = BitmapFactory.decodeStream(bis);
            bis.close();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return bitmap;
    }
}

转自:http://www.cnblogs.com/yeagen/archive/2011/04/19/2020985.html

★android开发--ListView+Json+异步网络图片加载+滚动翻页的例子(图片能缓存,图片不错乱)的更多相关文章

  1. Android 异步网络图片加载

    ListView异步加载图片 http://www.eoeandroid.com/forum.php?mod=viewthread&tid=161586 [Android分享] ListVie ...

  2. Android开发之多媒体编程之加载大分辨率图片

    Android中图片占用内存的大小=图片的总像数*每个像数占用的大小. Android保存图片像素信息使用ARGB,意思是每个像素占用4个字节. 以分辨率为2400*3200的图片来说,加载到Andr ...

  3. Python网络爬虫_爬取Ajax动态加载和翻页时url不变的网页

    1 . 什么是 AJAX ? AJAX = 异步 JavaScript 和 XML. AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新 ...

  4. 使用scrollpagination实现页面底端自动加载无需翻页功能

    当阅读到页面最底端的时候,会自动显示一个"加载中"的功能,并自动从服务器端无刷新的将内容下载到本地浏览器显示. 这样的自动加载功能是如何实现的?jQuery的插件 ScrollPa ...

  5. Android之ListView&Json加载网络数据

    使用到的主要内容: 1.Json 解析网络数据 2.异步任务加载图片和数据 3.ListView 的内存空间优化(ConvertView)和运行时间优化(ViewHolder) 4.ListView ...

  6. json解析,异步下载(listview仅滑动时加载)Demo总结

    异步加载的练习demo 主要涉及知识点: 1.解析json格式数据,主要包括图片,文本 2.使用AsynTask异步方式从网络下载图片 3.BaseAdapter的"优雅"使用 4 ...

  7. 55、Android网络图片 加载缓存处理库的使用

         先来一个普通的加载图片的方法. import android.annotation.SuppressLint; import android.app.Activity; import and ...

  8. Android之网络图片加载的5种基本方式

    学了这么久,最近有空把自己用到过的网络加载图片的方式总结了出来,与大家共享,希望对你们有帮助. 此博客包含Android 5种基本的加载网络图片方式,包括普通加载HttpURLConnection.H ...

  9. android 在自定义的listview(有刷新加载项)列表中,数据过少时不能铺满整个屏幕时,header和footer同时显示问题

    android  在自定义的listview(有刷新加载项)列表中,数据过少时,当刷新时,加载项也会显示,这是很头疼的一个问题,查阅了一些资料,总结了一个比较不错的方法: 原来代码: @Overrid ...

随机推荐

  1. 总结一下一般游戏中3D模型各种勾边方法遇到的工程性问题

    以前做过简单的rim light勾边,几何勾边,这次又做了后处理的勾边,工程化的时候,都遇到很多问题,简单总结一下. 首先是火炬之光勾边效果,类似轮廓光的实现,简单的卡通渲染也是通过类似的算法加采样色 ...

  2. linux xwiki搭建过程

    安装mysql数据库,并创建xwiki数据库及用户 mysql> create database xwiki; Query OK, 1 row affected (0.00 sec) mysql ...

  3. 客户端缓存 HTML + 远程数据 JS 的思路。

    移动客户端,采用客户端集成 WebBrowser 的方式 ,加载远程网页的优化方案. 1. 远程 HTML版本 v1.2 一次性加载到客户端 2. 手机端打开时,检测HTML版本. 如果有新版,先更新 ...

  4. 改进ConcurrentDictionary并行使用的性能

    上一篇文章“ConcurrentDictionary 对决 Dictionary+Locking”中,我们知道了 .NET 4.0 中提供了线程安全的 ConcurrentDictionary< ...

  5. 深入理解java虚拟机【Java内存结构】

    Java虚拟机规范规定的java虚拟机内存其实就是java虚拟机运行时数据区,其架构如下: 其中方法区和堆是由所有线程共享的数据区. Java虚拟机栈,本地方法栈和程序计数器是线程隔离的数据区. (1 ...

  6. 注册asp.net

    %windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i

  7. inventor应用程序错误---解决方法

    ---恢复内容开始--- 点击 出现类似 我使用了网上的几个方法,最后是下载了2014--SP1补丁安装后就能正常打开程序了 http://pan.baidu.com/s/1pLQxp2b 这是地址3 ...

  8. Atitit.实现反向代理(1)----url rewrite 配置and内容改写 and -绝对路径链接改写 java php

    Atitit.实现反向代理(1)----url rewrite  配置and内容改写 and -绝对路径链接改写 java php 1. 代理的实现:::普通代理and反向代理?? 1 2. url  ...

  9. javaweb学习总结(十四)——JSP原理

    一.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写h ...

  10. Nginx + FastCgi + Spawn-fcgi + c 的架构

    参考: nginx+c/c++ fastcgi:http://www.yis.me/web/2011/11/01/66.htm cgi探索之路:http://github.tiankonguse.co ...