当前位置: 移动技术网 > IT编程>移动开发>Android > Android程序开发ListView+Json+异步网络图片加载+滚动翻页的例子(图片能缓存,图片不错乱)

Android程序开发ListView+Json+异步网络图片加载+滚动翻页的例子(图片能缓存,图片不错乱)

2019年07月24日  | 移动技术网IT编程  | 我要评论

晋江天气预报,夹江瓷砖,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+异步网络图片加载+滚动翻页的例子(图片能缓存,图片不错乱)的相关知识,希望对大家有所帮助。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网