晋江天气预报,夹江瓷砖,t-953擦试剂
例子中用于解析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; } }
以上所述是小编给大家分享的android程序开发listview+json+异步网络图片加载+滚动翻页的例子(图片能缓存,图片不错乱)的相关知识,希望对大家有所帮助。
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Android apk 项目一键打包并上传到蒲公英的实现方法
Android 自定义LineLayout实现满屏任意拖动功能的示例代码
android 限制某个操作每天只能操作指定的次数(示例代码详解)
Android 集成 google 登录并获取性别等隐私信息的实现代码
网友评论