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