Android程序开发ListView+Json+异步网络图片加载+滚动翻页的例子(图片能缓存,图片不错乱)
例子中用于解析Json的Gson请自己Google下载
主Activity:
packageCOM.Example.Main;
importjava.util.HashMap;
importjava.util.Iterator;
importjava.util.LinkedList;
importjava.util.List;
importjava.util.Map;
importCOM.Example.Main.R;
importCOM.Example.Main.stringGetJson.User;
importandroid.app.Activity;
importandroid.app.ListActivity;
importandroid.os.AsyncTask;
importandroid.os.Bundle;
importandroid.view.Gravity;
importandroid.view.LayoutInflater;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.AbsListView;
importandroid.widget.AbsListView.OnScrollListener;
importandroid.widget.ArrayAdapter;
importandroid.widget.ImageView;
importandroid.widget.LinearLayout;
importandroid.widget.ListView;
importandroid.widget.ProgressBar;
importandroid.widget.TextView;
publicclassstringListActivityextendsListActivity{
privateMyAdaptermMyAdapter;
privateLinkedList<User>users=null;
//当前Activity中的ListView
ListViewlistView=null;
intlastItem=0;
LinearLayoutloadingLayout=null;
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.foodlistactivity);
listView=getListView();
setLoadingLayout();
newreadTask().execute(null);
}
privatefinalclassMyAdapterextendsArrayAdapter<User>{
publicMyAdapter(Activityactivity,List<User>newsList){
super(activity,0,newsList);
}
privateMap<Integer,View>viewMap=newHashMap<Integer,View>();
@Override
publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
ViewHolderholder;
ViewrowView=this.viewMap.get(position);
if(rowView==null){
Useruser=users.get(position);
LayoutInflaterinflater=((Activity)this.getContext())
.getLayoutInflater();
holder=newViewHolder();
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);
newdownImageTask().execute(holder.mPhoto);
holder.mPhoto.setDrawingCacheEnabled(true);
}
viewMap.put(position,rowView);
}else{
holder=(ViewHolder)rowView.getTag();
}
returnrowView;
}
publicclassViewHolder{
publicTextViewmNameText;
publicImageViewmPhoto;
}
}
publicvoidsetLoadingLayout(){
LinearLayoutlayout=newLinearLayout(this);
layout.setOrientation(LinearLayout.HORIZONTAL);
ProgressBarprogressBar=newProgressBar(this);progressBar.setPadding(0,0,15,0);layout.addView(progressBar);TextViewtextView=newTextView(this);textView.setText("加载中...");textView.setGravity(Gravity.CENTER_VERTICAL);layout.addView(textView);layout.setGravity(Gravity.CENTER);loadingLayout=newLinearLayout(this);loadingLayout.addView(layout);loadingLayout.setGravity(Gravity.CENTER);}privateclassscrollListenerimplementsOnScrollListener{@OverridepublicvoidonScroll(AbsListViewview,intfirstVisibleItem,intvisibleItemCount,inttotalItemCount){//当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}@OverridepublicvoidonScrollStateChanged(AbsListViewview,intscrollState){if(lastItem==mMyAdapter.getCount()&&scrollState==OnScrollListener.SCROLL_STATE_IDLE){//进行翻页操作newscrollTask().execute(null);}}}publicclassreadTaskextendsAsyncTask<Object,Void,Void>{@OverrideprotectedVoiddoInBackground(Object...arg0){users=newstringGetJson().getJson();returnnull;}@OverrideprotectedvoidonPostExecute(Voidresult){listView.addFooterView(loadingLayout);mMyAdapter=newMyAdapter(stringListActivity.this,users);setListAdapter(mMyAdapter);listView.setOnScrollListener(newscrollListener());}}publicclassscrollTaskextendsAsyncTask<Object,Void,Void>{@OverrideprotectedVoiddoInBackground(Object...arg0){for(Iteratoriterator=newstringGetJson().getJson().iterator();iterator.hasNext();){Useruser=(User)iterator.next();users.add(user);}returnnull;}@OverrideprotectedvoidonPostExecute(Voidresult){mMyAdapter.notifyDataSetChanged();}}}
Json数据来源(这里的例子中把json字符串直接写在代码中了,实际项目中需要改成从网络读取,例子中已经使用了多线程):
packageCOM.Example.Main;
importjava.lang.reflect.Type;
importjava.util.Iterator;
importjava.util.LinkedList;
importandroid.database.MatrixCursor;
importandroid.widget.ListView;
importandroid.widget.TextView;
importcom.google.gson.Gson;
importcom.google.gson.reflect.TypeToken;
publicclassstringGetJson{
//设置临时ID,在项目中将被现实的id取代
privateintid=0;
publicstringGetJson(){
super();
}
//通过getJson方法从Json字符串获取User的列表
publicLinkedList<User>getJson(){
StringjsonData="[{\"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\"}]";
TypelistType=newTypeToken<LinkedList<User>>(){}.getType();
Gsongson=newGson();
LinkedList<User>users=gson.fromJson(jsonData,listType);
returnusers;
}
//为getJson提供了数据实体类
finalstaticclassUser{
publicStringName;
publicStringPic;
}
}
图片下载AsyncTask
packageCOM.Example.Main;
importCOM.Example.FunctionUtility.Download;
importandroid.graphics.Bitmap;
importandroid.os.AsyncTask;
importandroid.widget.ImageView;
publicclassdownImageTaskextendsAsyncTask<ImageView,Void,Bitmap>{
ImageViewgView=null;
@Override
protectedBitmapdoInBackground(ImageView...arg0){
gView=(ImageView)arg0[0];
returnDownload.getBitmapFromUrl(gView.getTag().toString());
}
@Override
protectedvoidonPostExecute(Bitmapresult){
if(result!=null){
this.gView.setImageBitmap(result);
}
this.gView=null;
}
}
网络图片下载类:
packageCOM.Example.FunctionUtility;
importjava.io.BufferedInputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.net.MalformedURLException;
importjava.net.URL;
importandroid.graphics.Bitmap;
importandroid.graphics.BitmapFactory;
publicclassDownload{
publicstaticBitmapgetBitmapFromUrl(StringimgUrl){
URLurl;
Bitmapbitmap=null;
try{
url=newURL(imgUrl);
InputStreamis=url.openConnection().getInputStream();
BufferedInputStreambis=newBufferedInputStream(is);
bitmap=BitmapFactory.decodeStream(bis);
bis.close();
}catch(MalformedURLExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
returnbitmap;
}
}
以上所述是小编给大家分享的Android程序开发ListView+Json+异步网络图片加载+滚动翻页的例子(图片能缓存,图片不错乱)的相关知识,希望对大家有所帮助。