加載網絡圖片生成listview,經過打開網絡鏈接,經過異步線程處理網絡加載,並設置圖片android
MainActivity代碼json
鏈接網絡,解析JSON代碼,將所解析出的Json對象封存,添加到List中並與以後自定義的Adapter關聯api
public class MainActivity extends AppCompatActivity { private List<Newsbeans> mlist; private static String url="http://www.imooc.com/api/teacher?type=4&num=30"; private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Myaysctask myaysctask=new Myaysctask(); //將url傳遞進去實現對於url的異步訪問 new Myaysctask().execute(url); listView= (ListView) findViewById(R.id.listview); } //將url轉化爲咱們所須要的json對象 private List<Newsbeans> getjsondata(String url){ //初始化list mlist=new ArrayList<>(); JSONObject jsonObject=null; Newsbeans newsbeans=new Newsbeans(); try { //獲取字節流 String jsonstring= readStream(new URL(url).openStream()); //將傳入的字節流轉化爲json對象 jsonObject=new JSONObject(jsonstring); //獲得json下的data下的數組 JSONArray jsonArray=jsonObject.getJSONArray("data"); for(int i=0;i<jsonArray.length();i++){ //遍歷json數組的到jsonobject的值 jsonObject=jsonArray.getJSONObject(i); newsbeans=new Newsbeans(); //將jsonobject中的值賦予到已經封裝好的值之中 newsbeans.newscontent=jsonObject.getString("description"); newsbeans.newspic=jsonObject.getString("picSmall"); newsbeans.newstitle=jsonObject.getString("name"); //將newsbeans添加到list之中 mlist.add(newsbeans); } } catch (IOException | JSONException e) { e.printStackTrace(); } return mlist; } private String readStream(InputStream is){ String result=""; String line=""; try { //將inputstream傳入的爲字節流,經過inputstreamreader將字節流轉換爲字符流 InputStreamReader irs=new InputStreamReader(is,"utf-8"); //經過bufferedreader將輸入流讀取出來 BufferedReader br= new BufferedReader(irs); while ((line= br.readLine())!=null){ result+=line; } } catch (IOException e) { e.printStackTrace(); } return result; } class Myaysctask extends AsyncTask<String,Void,List<Newsbeans>>{ @Override //進行全部的耗時操做但不包括更改UI protected List<Newsbeans> doInBackground(String... strings) { //將string數組中的0位返回也就是傳入url return getjsondata(strings[0]); } @Override
//加載所需的adapter protected void onPostExecute(List<Newsbeans> newsbeans) { Myadapter myadapter=new Myadapter(MainActivity.this,newsbeans); listView.setAdapter(myadapter); super.onPostExecute(newsbeans); } } }
使用高效的adapter,關聯listview數組
1 public class Myadapter extends BaseAdapter { 2 private Context context; 3 private List<Newsbeans> mlist; 4 private LayoutInflater mlayoutinflater; 5 public Myadapter(Context context, List<Newsbeans> mlist1){ 6 mlist=mlist1; 7 mlayoutinflater=LayoutInflater.from(context); 8 } 9 @Override 10 public int getCount() { 11 12 return mlist.size(); 13 } 14 15 @Override 16 public Object getItem(int i) { 17 return mlist.get(i); 18 } 19 20 @Override 21 public long getItemId(int i) { 22 return i; 23 } 24 25 @Override 26 public View getView(int i, View convertview, ViewGroup viewGroup) { 27 Viewholder viewholder=null; 28 if(convertview==null){ 29 viewholder=new Viewholder(); 30 //將item的layout文件轉化爲view,必須是item文件在以後的view中還要找到對應的控件 31 convertview=mlayoutinflater.inflate(R.layout.item,null); 32 viewholder.contenttext= (TextView)convertview.findViewById(R.id.tv_content); 33 viewholder.imageView=(ImageView)convertview.findViewById(R.id.imageview); 34 viewholder.titletext=(TextView)convertview.findViewById(R.id.tv_title); 35 convertview.setTag(viewholder); 36 } 37 else { 38 viewholder=(Viewholder)convertview.getTag(); 39 } 40 Newsbeans newsbeans=mlist.get(i); 41 viewholder.imageView.setImageResource(R.mipmap.ic_launcher); 42 //調用方法傳遞所需信息 43 new ImageviewHolder().newthread(viewholder.imageView,mlist.get(i).newspic); 44 viewholder.imageView.setTag(mlist.get(i).newspic); 45 viewholder.titletext.setText(newsbeans.newstitle); 46 viewholder.contenttext.setText(newsbeans.newscontent); 47 return convertview; 48 } 49 class Viewholder{ 50 public TextView titletext; 51 public TextView contenttext; 52 public ImageView imageView; 53 } 54 }
使用Handler加載網絡圖片緩存
1 public class ImageviewHolder { 2 //設置全局變量 3 private ImageView mImageView; 4 private String mURL; 5 //定義handler,在handler之中設定UI 6 private android.os.Handler mHadler= new android.os.Handler(){ 7 @Override 8 public void handleMessage(Message msg) { 9 //因爲Listview的緩存屬性,在設加載UI的時候可能會出現重複加載的狀況 10 if(mImageView.getTag().equals(mURL)){ 11 mImageView.setImageBitmap((Bitmap) msg.obj); 12 } 13 14 super.handleMessage(msg); 15 } 16 }; 17 public void newthread(ImageView imageView, final String url){ 18 mImageView=imageView; 19 mURL=url; 20 //進行全部的耗時操做 21 new Thread(){ 22 @Override 23 public void run(){ 24 try { 25 Thread.sleep(2000); 26 Message message=new Message(); 27 //傳遞信息,將message的obj設置爲一個bitmap並傳遞給handler設置UI 28 message.obj=getbitmapstream(url); 29 mHadler.sendMessage(message); 30 } catch (IOException | InterruptedException e) { 31 e.printStackTrace(); 32 } 33 super.run(); 34 } 35 }.start(); 36 } 37 public Bitmap getbitmapstream(String bitmapurl) throws IOException { 38 InputStream is=null; 39 try { 40 //指向互聯網資源的指針 41 URL url=new URL(bitmapurl); 42 //打開鏈接,並強行轉換格式 43 HttpURLConnection connection= (HttpURLConnection) url.openConnection(); 44 //獲取輸入的數據流 45 is=new BufferedInputStream(connection.getInputStream()); 46 //解析所傳入的數據 47 Bitmap bitmap= BitmapFactory.decodeStream(is); 48 //斷開鏈接 49 connection.disconnect(); 50 return bitmap; 51 } catch (IOException e) { 52 e.printStackTrace(); 53 } 54 finally { 55 //斷開數據流 56 assert is != null; 57 is.close(); 58 } 59 return null; 60 } 61 }