轉發請註明出處:http://blog.csdn.net/qq_28055429/article/details/51941385
一,Handler:
(1)解釋:處理者,即消息傳遞機制
(2)基本方法:
void handleMessage(Message msg):處理消息,經常使用此方法
Message obtainMessage():獲取消息
以下幾個方法均以final boolean 開頭:
sendEmptyMessage(int what):發送空消息
sendEmptyMessageDelayed(int what , long delayMills):指定多少毫秒後發送空消息
sendMessage(Message msg):立即發送消息 ,常用此方法
sendMessageDelayed(Message msg , long delayMillis):指定多少毫秒後發送消息
hasMessages(int what):檢查消息隊列中是否包含what屬性爲指定值的消息
hasMessages(int what , Object object):檢查消息隊列中是否包含屬性值what,object屬性爲指定對象的消息
(3)兩個常用作用:
----在新啓動的線程中發送消息
------在主線程中獲取,處理消息
(4)相關聯:Message,Loop,MessageQueue,
Message:Handler接收和處理的消息對象,其相關參數有:
--- arg1和arg2 :用來存放整型數據的;
----- what :用來保存消息標示的;
----- obj :是Object類型的任意對象;
----- replyTo :是消息管理器,會關聯到一個handler
Looper :每個線程只能有一個Looper,其loop方法負責讀取MessageQueue中的消息,然後發給Handler處理
MessageQueue:消息隊列,採用先進先出來存儲管理Message
二,Handler和Message的一般處理步驟(Loop ,MessageQueue暫時不探討)
(1)創建Handler對象,可以採用繼承Handler的方法,也可以採用new Handler方法,如下:
public class ImageHandle extends Handler{};
或 private Handler handler = new Handler(){}
(2)重寫其handleMessage(Message msg)方法,根據傳回來的Message對象去處理
(3)在需要的地方,創建Message對象,並設置其相關參數,再調用handler.sendMessage(message)發送消息給Handler處理
如:
Message message = new Message();
message.what = i ;
handler.sendMessage(message);
(4)然後handler就去處理了,,
三,3個例子:
例子(1):從網絡上加載圖片,然後顯示出來:
佈局文件:activity_third:採用ScrollView佈局,放置一個LinearLayout(裏面放置3個ImageView,用於顯示網上圖片)
<?xml version="1.0" encoding="utf-8"?>
<!--定義頁面的基本佈局:滾動佈局-->
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--在滾動佈局中加入線性佈局-->
<LinearLayout
android:id="@+id/layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal"
android:background="@color/skyblue"
android:orientation="vertical">
<!--加入圖片控件1和3-->
<ImageView
android:id="@+id/Iv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ImageView
android:id="@+id/Iv2"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ImageView
android:id="@+id/Iv3"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</ScrollView>
package testsdcard.com.maiyu.s04_71.activity.handle;
import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.media.Image;
import android.os.Handler;
import android.os.Message;
import android.widget.ImageView;
import java.net.URL;
/**
* Created by maiyu on 2016/7/16.
*/
public class ImageHandle extends Handler {
Activity context ; //定義Activity的上下文對象
public ImageHandle(Activity context){
this.context = context;
}
//接收thread發送過來的mesage信息
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//從message信息中得到從網絡請求下來的圖片信息,並設置到imageView對象上
ImageView img = (ImageView)context.findViewById(msg.arg1);
img.setImageDrawable((Drawable)msg.obj);
}
//讀取網絡圖片的函數,第一個參數爲網絡圖片的url,第二個圖片爲需要設置的圖片控件的id
public void loadImg(final String imgUrl , final int viewId){
//建立一個線程
Thread thread = new Thread(){
@Override
public void run() {
try{
//讀取網絡上的圖片
Drawable drawable = Drawable.createFromStream(new URL(imgUrl).
openStream() , "img.png");
//定義Message對象
Message msg = ImageHandle.this.obtainMessage();
//設置Message對象的參數
msg.arg1 = viewId ;
msg.obj = drawable ;
//調用handle的sendMessage函數
ImageHandle.this.sendMessage(msg);
}catch(Exception e){
e.printStackTrace();
}
}
};
//啓動線程
thread.start();
thread = null ;
}
}
測試類:ThirdActivity:繼承Activity,調用ImageHandle的loadImg方法,即可,代碼如下:
package testsdcard.com.maiyu.s04_71.activity;
import android.app.Activity;
import android.os.Bundle;
import testsdcard.com.maiyu.s04_71.R;
import testsdcard.com.maiyu.s04_71.activity.handle.ImageHandle;
/**
* Created by maiyu on 2016/7/16.
*/
public class ThirdActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_third);
//開啓一個加載圖片的handler,設置Iv1的圖片
ImageHandle imageHandle1 = new ImageHandle(this);
imageHandle1.loadImg("http://p0.so.qhimg.com/t01acc71e1e343e5f1a.jpg" ,R.id.Iv1);
//開啓一個加載圖片的handler,設置Iv2的圖片
ImageHandle imageHandle2 = new ImageHandle(this);
imageHandle2.loadImg("http://www.it.com.cn/games/image/news/2009/12/03/16/jr1203ldd03.jpg", R.id.Iv2);
//開啓一個加載圖片的handler,設置Iv3的圖片
ImageHandle imageHandle3 = new ImageHandle(this);
imageHandle3.loadImg("http://p2.so.qhimg.com/t0178e98dcb5581fa7c.jpg" , R.id.Iv3);
}
}
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
結果:輸出3個圖片,可以滾動的,,,,圖略
例子(2):從網絡下載文件存到本地sdcard,可中斷,同樣利用handler + message
佈局:activity_five:一個textView,一個editText,兩個button(開始與結束),一個進度條
<?xml version="1.0" encoding="utf-8"?>
<!--定義基本佈局:LinearLayout-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!--一個TextView-->
<TextView
android:id="@+id/Tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/five_tv"/>
<!--輸入框-->
<EditText
android:id="@+id/Et"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/five_et"/>
<!--兩個按鈕:開始與停止-->
<Button
android:id="@+id/BtnStart"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/five_btn1"/>
<Button
android:id="@+id/BtnStop"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/five_btn2"/>
<!--進度條-->
<ProgressBar
android:id="@+id/Pb"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="100"/>
</LinearLayout>
strings的內容:
<string name="button5">文件下載存入sdcard</string>
<string name="five_tv">請輸入下載地址</string>
<string name="five_et">http://p1.so.qhimg.com/t0127d1282a580df751.jpg</string>
<string name="five_btn1">開始下載</string>
<string name="five_btn2">停止下載</string>
package testsdcard.com.maiyu.s04_79.activity;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import testsdcard.com.maiyu.s04_79.R;
/**
* Created by maiyu on 2016/7/18.
*/
public class FiveActivity extends Activity {
private ProgressBar pb ; //定義進度條
private TextView tv ; //文本框和編輯框和兩個按鈕
private EditText et ;
private Button btnstart , btnstop ;
private int fileSize , downLoadFileSize ; //文件大小和已經下載的文件的大小
private String filename ; //文件名字
private Thread thread ; //線程對象
//處理其他線程message的hanlder對象,根據message傳來的數據去處理
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
//如果線程沒有終止
if(!Thread.currentThread().isInterrupted()){
switch (msg.what){
//發送0--設置進度條總長,不用break繼續判斷
case 0 :
pb.setMax(fileSize);
//1--文件正在下載
case 1 :
pb.setProgress(downLoadFileSize); //設置進度
int result = downLoadFileSize * 100 /fileSize ; //百分比
tv.setText(result + "%");
break;
case 2 : //2---下載完畢
Toast.makeText(FiveActivity.this , "文件已下載完畢,請在sdcard下查看", Toast.LENGTH_SHORT).show();
break;
case 3 : //下載被停止了
Toast.makeText(FiveActivity.this , "文件已停止下載" ,Toast.LENGTH_SHORT).show();
pb.setProgress(0);
tv.setText("0%");
break;
case -1 : //-1---下載出錯
String error = msg.getData().getString("error");
Toast.makeText(FiveActivity.this , error , Toast.LENGTH_SHORT).show();
break;
}
}
super.handleMessage(msg);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_five);
findView(); //綁定id
setListener(); //設置監聽
}
//爲兩個按鈕設置監聽器
private void setListener() {
btnstart.setOnClickListener(mylistener); //mylistener爲自定義監聽器
btnstop.setOnClickListener(mylistener);
}
//自定義監聽器
View.OnClickListener mylistener = new View.OnClickListener() {
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.BtnStart :
//新開一個線程開始下載文件
thread = new Thread(){
@Override
public void run() {
try{
//得到下載地址
String str = et.getText().toString();
down_file(str , "/sdcard/"); //調用自定義方法down_file:存儲在sdcard目錄下
//down_file(str);
}catch (Exception e){
e.printStackTrace();
}
//super.run();
}
};
thread.start(); //啓動線程
break;
case R.id.BtnStop :
thread.interrupt(); //中斷線程
break;
default :
break;
}
}
};
//爲各個控件綁定id
private void findView() {
pb = (ProgressBar)findViewById(R.id.Pb);
tv = (TextView)findViewById(R.id.Tv);
et = (EditText)findViewById(R.id.Et);
btnstart = (Button)findViewById(R.id.BtnStart);
btnstop = (Button)findViewById(R.id.BtnStop);
}
//根據url下載文件,保存在path下
public void down_file(String url ,String path) throws IOException{
filename = url.substring(url.lastIndexOf("/") + 1); //得到文件名字
URL mURL = new URL(url); //創建URL
URLConnection conn = mURL.openConnection(); //得到URLConnection對象
conn.connect(); //連接URLConnectioin
InputStream is = conn.getInputStream() ; //得到輸入流
fileSize = conn.getContentLength() ; //獲取文件大小
if(fileSize <= 0){
throw new RuntimeException("文件無法獲知大小");
}
if(is == null){
throw new RuntimeException("數據流爲空的");
}
//定義本地文件的讀取流對象
FileOutputStream fos = new FileOutputStream(path + filename);
//FileOutputStream fos = new FileOutputStream( Environment.getExternalStorageDirectory()+filename);
byte buf[] = new byte[1024]; //byte[]數組,每次讀取大小
downLoadFileSize = 0 ; //初始化
sendMsg(0); //設置總的進度條
do{
int numread = is.read(buf); //循環讀取
if(Thread.currentThread().isInterrupted()){
sendMsg(3); //中斷時
try{
is.close();
}catch (Exception e){
e.printStackTrace();
}
return;
}
if(numread == -1){ //完畢時退出循環
break;
}
fos.write(buf , 0 , numread); //寫入
downLoadFileSize += numread ;
sendMsg(1); //更新進度
}while (true);
sendMsg(2); //下載完畢
try{
is.close(); //關閉流
}catch (Exception e){
e.printStackTrace();
}
}
//從子線程發送message給主線程
private void sendMsg(int i) {
Message message = new Message();
message.what = i ;
handler.sendMessage(message);
}
}
記得添加權限:
分別是:訪問網絡權限;往sdcard寫入權限;在sdcard下創建和刪除權限
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
如何,去sdcard目錄下,查看,發現剛剛下載的東西已經存在了
例子(3),足球明星圖片和名字和簡介網上加載:(C羅,梅西,納尼)
佈局:有兩個
第一個:activity_second.xml放置一個listView,用於下拉,代碼如下:
<?xml version="1.0" encoding="utf-8"?>
<!--定義基本的線性佈局-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--定義列表佈局ListView-->
<ListView
android:id="@+id/Lv"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
第二個:listview_second.xml:定義listView的每一個子項的內容格式,一個ImageView,兩個TextView(名字和簡介),代碼:
<?xml version="1.0" encoding="utf-8"?>
<!--定義GridView的item的佈局文件-->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="40dp">
<!--item的圖片控件-->
<ImageView
android:id="@+id/ItemIv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"/>
<!--item的姓名文字控件-->
<TextView
android:id="@+id/ItemTvName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@id/ItemIv"/>
<!--item的簡介文字控件-->
<TextView
android:id="@+id/ItemTvInfo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/ItemIv"/>
</RelativeLayout>
一個佔位符類,類似於自定義適配器裏的ViewHolder內部類(佔位符):
ViewCache2---------- 主要定義剛剛佈局的ImageView,2個TextView找到id
代碼:
package testsdcard.com.maiyu.s04_79.domain;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import testsdcard.com.maiyu.s04_79.R;
/**定義視圖的佔位符類
* Created by maiyu on 2016/7/17.
*/
public class ViewCache2 {
private View baseView ; //定義基本視圖對象
private TextView textViewname , textViewinfo ; //定義要顯示的標題,圖片,信息
private ImageView imageView ;
//初始化基本視圖
public ViewCache2(View baseView){
this.baseView = baseView ;
}
//3個get方法,分別得到圖片,標題,信息
public TextView getTextViewname(){
if(textViewname == null){
textViewname = (TextView)baseView.findViewById(R.id.ItemTvName);
}
return textViewname ;
}
public TextView getTextViewinfo(){
if(textViewinfo == null){
textViewinfo = (TextView)baseView.findViewById(R.id.ItemTvInfo);
}
return textViewinfo;
}
public ImageView getImageView(){
if(imageView == null){
imageView = (ImageView)baseView.findViewById(R.id.ItemIv);
}
return imageView ;
}
}
一個異步圖片加載類AsyncImageLoader2:
用HashMap<String , SoftReference<Drawable>> imageCache; 來存儲緩存圖片,再次加載此圖片時,無需從網上加載,
其中String代表網址,判斷該imageCache是否已經存有String這個網址了,有就用本地的緩存圖片,無就網上加載
代碼:if( imageCache.containsKey(imageUrl) ){//設置代碼}
完整代碼如下:
package testsdcard.com.maiyu.s04_79.domain;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message;
import java.io.InputStream;
import java.lang.ref.SoftReference;
import java.net.URL;
import java.util.HashMap;
/**定義異步加載圖片類
* Created by maiyu on 2016/7/17.
*/
public class AsyncImageLoader2 {
//定義異步加載圖片的緩存哈希圖
private HashMap<String ,SoftReference<Drawable>> imageCache ;
public AsyncImageLoader2(){
imageCache = new HashMap<String ,SoftReference<Drawable>>();
}
//獲取圖片的方法
public Drawable loadDrawable(final String imageUrl , final ImageCallback imageCallback){
//判斷圖片緩存中是否已經有此圖片,有則返回
if(imageCache.containsKey(imageUrl)){
SoftReference<Drawable> softReference = imageCache.get(imageUrl);
Drawable drawable = softReference.get();
if(drawable != null){
return drawable ;
}
}
//定義handler對象來發送message
final Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
imageCallback.imageLoaded((Drawable)msg.obj , imageUrl);
//super.handleMessage(msg);
}
};
//定義一個新的線程用來讀取網絡上的圖片地址
new Thread(){
@Override
public void run() {
//讀取圖片地址imageUrl
Drawable drawable = loadImageFromUrl(imageUrl);
//將圖片讀取到的地址添加到緩存列表中
imageCache.put(imageUrl , new SoftReference<Drawable>(drawable));
//定義message對象,設置內容爲加載到的圖片對象
Message message = handler.obtainMessage(0 , drawable);
//發送圖片
handler.sendMessage(message);
// super.run();
}
}.start();
return null ;
}
//從圖片地址讀取圖片
public static Drawable loadImageFromUrl(String url){
URL m ;
InputStream i = null ; //定義url對象,及inputstream對象
try{
//通過圖片的url得到圖片的inputStream對象
m = new URL(url);
i = (InputStream)m.getContent();
}catch(Exception e){
e.printStackTrace();
}
//通過inputStream對象得到圖片的Drawable對象
Drawable d = Drawable.createFromStream(i , "src");
return d ;
}
//圖片獲取到後的接口
public interface ImageCallback{
public void imageLoaded(Drawable imageDrawable , String imageUrl);
}
}
自定義適配器,ListViewAdapter:繼承ArrayAdapter<ListItem>,重寫getView()方法,在裏面實現相關代碼,佔位符類已經在之前定了,故而不創建ViewHolder內部類了,代碼如下:
package testsdcard.com.maiyu.s04_79.adapter;
import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import java.util.List;
import testsdcard.com.maiyu.s04_79.R;
import testsdcard.com.maiyu.s04_79.domain.AsyncImageLoader2;
import testsdcard.com.maiyu.s04_79.domain.ViewCache;
import testsdcard.com.maiyu.s04_79.domain.ViewCache2;
import testsdcard.com.maiyu.s04_79.moudle.ListItem;
/**
* Created by maiyu on 2016/7/17.
*/
public class ListViewAdapter extends ArrayAdapter<ListItem> {
private ListView listView ;
//定義異步圖片加載對象
private AsyncImageLoader2 asyncImageLoader2 ;
public ListViewAdapter(Context context , List<ListItem> imageAndTexts , ListView listView) {
super(context, 0 , imageAndTexts);
//初始化數據
this.listView = listView ;
asyncImageLoader2 = new AsyncImageLoader2();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Activity activity = (Activity)getContext() ;
//讀取GridView的item佈局,讀取griditem.xml佈局
View rowView = convertView ;
ViewCache2 viewCache2 ;
if(rowView == null){
//讀取griditem.xml爲item的佈局
LayoutInflater inflater = activity.getLayoutInflater();
rowView = inflater.inflate(R.layout.listviewitem_second , null);
//通過當前的佈局視圖,初始化緩存視圖
viewCache2 = new ViewCache2(rowView);
//設置當前視圖的標籤
rowView.setTag(viewCache2);
}else{
viewCache2 = (ViewCache2)rowView.getTag();
}
//得到需要顯示的對象
ListItem imageAndText = getItem(position);
//讀取對象的相應內容值
String imageUrl = imageAndText.getImageUrl();
ImageView imageView = viewCache2.getImageView() ;
imageView.setTag(imageUrl);
//讀取緩存圖片
Drawable cachedImage = asyncImageLoader2.loadDrawable(imageUrl ,
new AsyncImageLoader2.ImageCallback(){
@Override
public void imageLoaded(Drawable imageDrawable, String imageUrl) {
//得到對應的ImageView對象
ImageView imageViewByTag = (ImageView)listView.findViewWithTag(imageUrl);
//設置圖片控件顯示的圖像
if(imageViewByTag != null){
imageViewByTag.setImageDrawable(imageDrawable);
}
}
});
//如果緩存圖片爲空,顯示默認圖片
if(cachedImage == null){
imageView.setImageResource(R.drawable.ic_launcher);
}else {
imageView.setImageDrawable(cachedImage);
}
//顯示姓名和簡介
TextView textViewname = viewCache2.getTextViewname();
textViewname.setText(imageAndText.getName());
TextView textViewinfo = viewCache2.getTextViewinfo();
textViewinfo.setText(imageAndText.getInfo());
return rowView;
}
}
測試類:SecondActivity:繼承Activity,綁定listView,添加自定義適配器(添加數據),爲listView設置適配器(根據自定義適配器的構造函數,注意參數),代碼如下:
package testsdcard.com.maiyu.s04_79.activity;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;
import testsdcard.com.maiyu.s04_79.R;
import testsdcard.com.maiyu.s04_79.adapter.ListViewAdapter;
import testsdcard.com.maiyu.s04_79.moudle.ListItem;
/**
* Created by maiyu on 2016/7/17.
*/
public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
ListView listView = (ListView)findViewById(R.id.Lv);
//定義數據list
List<ListItem> list = new ArrayList<ListItem>();
//添加數據
list.add(new ListItem("http://p1.so.qhimg.com/t011e24c3af6772acf6.jpg" ,"C羅" ,"克里斯蒂亞諾·羅納爾多(Cristiano Ronaldo),1985年2月5日出生於葡萄牙馬德拉島豐沙爾。簡稱C羅,葡萄牙足球運動員,司職邊鋒可兼任中鋒,現效力於西甲皇家馬德里足球俱樂部,並身兼葡萄牙國家隊隊長。"));
list.add(new ListItem("http://p1.so.qhimg.com/t019d0526e85eaa9ab6.jpg" ,"梅西","萊昂內爾·安德列斯·梅西(西班牙語:Lionel Andrés Messi),1987年6月24日生於阿根廷聖菲省羅薩里奧,綽號“新馬拉多納”,阿根廷著名足球運動員,司職前鋒、邊鋒和前腰,現效力於西班牙足球甲級聯賽巴塞羅那足球俱樂部。"));
list.add(new ListItem("http://www.188score.com/Upload/2_img2013_10/730_932348_927160.jpg","納尼","路易斯·卡洛斯·阿爾梅達·達·庫尼亞(Luis Carlos Almeida da Cunha),男,也叫\"納尼\",葡萄牙著名足球運動員,現效力於土耳其的費內巴切足球俱樂部,曾效力於曼徹斯特聯足球俱樂部、里斯本競技足球俱樂部。"));
list.add(new ListItem("http://p1.so.qhimg.com/t011e24c3af6772acf6.jpg" ,"C羅" ,"克里斯蒂亞諾·羅納爾多(Cristiano Ronaldo),1985年2月5日出生於葡萄牙馬德拉島豐沙爾。簡稱C羅,葡萄牙足球運動員,司職邊鋒可兼任中鋒,現效力於西甲皇家馬德里足球俱樂部,並身兼葡萄牙國家隊隊長。"));
list.add(new ListItem("http://p1.so.qhimg.com/t019d0526e85eaa9ab6.jpg" ,"梅西","萊昂內爾·安德列斯·梅西(西班牙語:Lionel Andrés Messi),1987年6月24日生於阿根廷聖菲省羅薩里奧,綽號“新馬拉多納”,阿根廷著名足球運動員,司職前鋒、邊鋒和前腰,現效力於西班牙足球甲級聯賽巴塞羅那足球俱樂部。"));
list.add(new ListItem("http://www.188score.com/Upload/2_img2013_10/730_932348_927160.jpg","納尼","路易斯·卡洛斯·阿爾梅達·達·庫尼亞(Luis Carlos Almeida da Cunha),男,也叫\"納尼\",葡萄牙著名足球運動員,現效力於土耳其的費內巴切足球俱樂部,曾效力於曼徹斯特聯足球俱樂部、里斯本競技足球俱樂部。"));
list.add(new ListItem("http://p1.so.qhimg.com/t011e24c3af6772acf6.jpg" ,"C羅" ,"克里斯蒂亞諾·羅納爾多(Cristiano Ronaldo),1985年2月5日出生於葡萄牙馬德拉島豐沙爾。簡稱C羅,葡萄牙足球運動員,司職邊鋒可兼任中鋒,現效力於西甲皇家馬德里足球俱樂部,並身兼葡萄牙國家隊隊長。"));
list.add(new ListItem("http://p1.so.qhimg.com/t019d0526e85eaa9ab6.jpg" ,"梅西","萊昂內爾·安德列斯·梅西(西班牙語:Lionel Andrés Messi),1987年6月24日生於阿根廷聖菲省羅薩里奧,綽號“新馬拉多納”,阿根廷著名足球運動員,司職前鋒、邊鋒和前腰,現效力於西班牙足球甲級聯賽巴塞羅那足球俱樂部。"));
list.add(new ListItem("http://www.188score.com/Upload/2_img2013_10/730_932348_927160.jpg","納尼","路易斯·卡洛斯·阿爾梅達·達·庫尼亞(Luis Carlos Almeida da Cunha),男,也叫\"納尼\",葡萄牙著名足球運動員,現效力於土耳其的費內巴切足球俱樂部,曾效力於曼徹斯特聯足球俱樂部、里斯本競技足球俱樂部。"));
list.add(new ListItem("http://p1.so.qhimg.com/t011e24c3af6772acf6.jpg" ,"C羅" ,"克里斯蒂亞諾·羅納爾多(Cristiano Ronaldo),1985年2月5日出生於葡萄牙馬德拉島豐沙爾。簡稱C羅,葡萄牙足球運動員,司職邊鋒可兼任中鋒,現效力於西甲皇家馬德里足球俱樂部,並身兼葡萄牙國家隊隊長。"));
list.add(new ListItem("http://p1.so.qhimg.com/t019d0526e85eaa9ab6.jpg" ,"梅西","萊昂內爾·安德列斯·梅西(西班牙語:Lionel Andrés Messi),1987年6月24日生於阿根廷聖菲省羅薩里奧,綽號“新馬拉多納”,阿根廷著名足球運動員,司職前鋒、邊鋒和前腰,現效力於西班牙足球甲級聯賽巴塞羅那足球俱樂部。"));
list.add(new ListItem("http://www.188score.com/Upload/2_img2013_10/730_932348_927160.jpg","納尼","路易斯·卡洛斯·阿爾梅達·達·庫尼亞(Luis Carlos Almeida da Cunha),男,也叫\"納尼\",葡萄牙著名足球運動員,現效力於土耳其的費內巴切足球俱樂部,曾效力於曼徹斯特聯足球俱樂部、里斯本競技足球俱樂部。"));
listView.setAdapter(new ListViewAdapter(this , list , listView));
}
}
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
結果:
出現一張可以下拉的帥氣的C羅,梅西,納尼的簡介表,,,略