List控件使用---SimpleAdapter使用詳解(二)

前言:前面的一篇博客講解了怎樣使用BaseAdapter,這篇博客講深入一些,實現從本地的JSON文件讀取數據,加載到listView中顯示。

先看效果:


再說一下,這篇文章的功能是:在派生自BaseAdapter基礎上,從本地JSON文件中讀取信息,動態生成listView頁面!

這篇文章的XML佈局文件沒有變,爲了大家方便還是貼一下吧。

[html] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="horizontal" android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent">  
  5.   
  6.     <ImageView android:id="@+id/img"   
  7.         android:layout_width="wrap_content"  
  8.         android:layout_height="wrap_content"   
  9.         android:layout_margin="5px"/>  
  10.   
  11.     <LinearLayout android:orientation="vertical"  
  12.         android:layout_width="wrap_content"   
  13.         android:layout_height="wrap_content">  
  14.   
  15.         <TextView android:id="@+id/name"   
  16.             android:layout_width="wrap_content"  
  17.             android:layout_height="wrap_content"   
  18.             android:textColor="#FFFFFF00"  
  19.             android:textSize="22px" />  
  20.         <TextView android:id="@+id/info"   
  21.             android:layout_width="wrap_content"  
  22.             android:layout_height="wrap_content"   
  23.             android:textColor="#FF00FFFF"  
  24.             android:textSize="13px" />  
  25.     </LinearLayout>  
  26.       
  27. </LinearLayout>  

一、JOSN文件內容(my_home_friends.txt):

[html] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. [{"name":"林珊","info":"上傳了一張新照片油畫”","photo":"youhua"},  
  2. {"name":"葉亞楠","info":"上傳了一張新照片日系妝”","photo":"rixizhuang"},  
  3. {"name":"王穎","info":"上傳了一張新照片最愛”","photo":"zuiai"},  
  4. {"name":"羅智宜","info":"上傳了一張新照片貓貓”","photo":"maomao"},  
  5. {"name":"羅智宜","info":"上傳了一張新照片魚”","photo":"yu"},  
  6. {"name":"羅智宜","info":"上傳了一張新照片賣萌”","photo":"maimeng"},  
  7. {"name":"程璐春","info":"上傳了一張新照片西藏”","photo":"xizang"},  
  8. {"name":"謝以荷","info":"上傳了一張新照片海邊”","photo":"haibian"}]  



注意:最後的photo字段存儲的JPG文件的文件名,所有的文件存放在assets/home/目錄下

二、JSON數據解析方法

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. private List<Map<String, Object>> getData() {  
  2.     List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();  
  3.     Map<String, Object> map = new HashMap<String, Object>();  
  4.     InputStream inputStream;  
  5.     try {  
  6.         inputStream=this.getAssets().open("my_home_friends.txt");  
  7.         String json=readTextFile(inputStream);  
  8.         JSONArray array = new JSONArray(json);  
  9.         for (int i = 0; i < array.length(); i++) {  
  10.             map = new HashMap<String, Object>();  
  11.             map.put("name", array.getJSONObject(i).getString("name"));  
  12.             map.put("info", array.getJSONObject(i).getString("info"));  
  13.             map.put("img",array.getJSONObject(i).getString("photo"));  
  14.             list.add(map);  
  15.         }  
  16.         return list;      
  17.           
  18.     } catch (Exception e) {  
  19.         // TODO: handle exception  
  20.         e.printStackTrace();  
  21.     }  
  22.       
  23.       
  24.     return list;      
  25. }  

講解:

1、

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. inputStream=this.getAssets().open("my_home_friends.txt");  
是打開assets文件夾下的my_home_friends.txt文件;

2、

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. String json=readTextFile(inputStream);  
  2. JSONArray array = new JSONArray(json);  
readTextFile()是自己實現的函數,後面給出具體代碼,實現將輸入流組裝成String字符串並返回;

然後將利用json字符串生成JSON數據。

3、後面的代碼就是利用jsonArray類的方法了,沒什麼好講的。

其中readTextFile()函數是將輸入的文件流組裝成String字符串返回;實現代碼如下:

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. public String readTextFile(InputStream inputStream) {  
  2.     String readedStr = "";  
  3.     BufferedReader br;  
  4.     try {  
  5.         br = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));  
  6.         String tmp;  
  7.         while ((tmp = br.readLine()) != null) {  
  8.             readedStr += tmp;  
  9.         }  
  10.         br.close();  
  11.         inputStream.close();  
  12.     } catch (UnsupportedEncodingException e) {  
  13.         e.printStackTrace();  
  14.     } catch (IOException e) {  
  15.         e.printStackTrace();  
  16.     }  
  17.   
  18.     return readedStr;  
  19. }  

三、全部代碼

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. public class MainActivity extends ListActivity{  
  2.   
  3.     private List<Map<String, Object>> mData;  
  4.     @Override  
  5.     public void onCreate(Bundle savedInstanceState) {  
  6.         super.onCreate(savedInstanceState);  
  7.         mData = getData();  
  8.         MyAdapter adapter = new MyAdapter(this);  
  9.         setListAdapter(adapter);  
  10.     }  
  11.       
  12.     private List<Map<String, Object>> getData() {  
  13.         List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();  
  14.         Map<String, Object> map = new HashMap<String, Object>();  
  15.         InputStream inputStream;  
  16.         try {  
  17.             inputStream=this.getAssets().open("my_home_friends.txt");  
  18.             String json=readTextFile(inputStream);  
  19.             JSONArray array = new JSONArray(json);  
  20.             for (int i = 0; i < array.length(); i++) {  
  21.                 map = new HashMap<String, Object>();  
  22.                 map.put("name", array.getJSONObject(i).getString("name"));  
  23.                 map.put("info", array.getJSONObject(i).getString("info"));  
  24.                 map.put("img",array.getJSONObject(i).getString("photo"));  
  25.                 list.add(map);  
  26.             }  
  27.             return list;      
  28.               
  29.         } catch (Exception e) {  
  30.             // TODO: handle exception  
  31.             e.printStackTrace();  
  32.         }  
  33.           
  34.           
  35.         return list;      
  36.     }  
  37.       
  38.   
  39.       
  40.     public final class ViewHolder{  
  41.         public ImageView img;  
  42.         public TextView name;  
  43.         public TextView info;  
  44.     }     
  45.       
  46.   
  47.       
  48.     public class MyAdapter extends BaseAdapter{  
  49.   
  50.         private LayoutInflater mInflater;  
  51.           
  52.         public MyAdapter(Context context){  
  53.             this.mInflater = LayoutInflater.from(context);  
  54.         }  
  55.         @Override  
  56.         public int getCount() {  
  57.             // TODO Auto-generated method stub  
  58.             return mData.size();  
  59.         }  
  60.   
  61.         @Override  
  62.         public Object getItem(int arg0) {  
  63.             // TODO Auto-generated method stub  
  64.             return null;  
  65.         }  
  66.   
  67.         @Override  
  68.         public long getItemId(int arg0) {  
  69.             // TODO Auto-generated method stub  
  70.             return 0;  
  71.         }  
  72.   
  73.         @Override  
  74.         public View getView(int position, View convertView, ViewGroup parent) {  
  75.               
  76.             ViewHolder holder = null;  
  77.             if (convertView == null) {  
  78.                   
  79.                 holder=new ViewHolder();    
  80.                   
  81.                 convertView = mInflater.inflate(R.layout.activity_main, null);  
  82.                 holder.img = (ImageView)convertView.findViewById(R.id.img);  
  83.                 holder.name = (TextView)convertView.findViewById(R.id.name);  
  84.                 holder.info = (TextView)convertView.findViewById(R.id.info);  
  85.                 convertView.setTag(holder);  
  86.                   
  87.             }else {  
  88.                   
  89.                 holder = (ViewHolder)convertView.getTag();  
  90.             }  
  91.               
  92.             holder.img.setImageBitmap(getHome((String)mData.get(position).get("img")));  
  93.             holder.name.setText((String)mData.get(position).get("name"));  
  94.             holder.info.setText((String)mData.get(position).get("info"));  
  95.   
  96.             return convertView;  
  97.         }  
  98.           
  99.     }  
  100.       
  101.     /** 
  102.      * 根據圖片名稱獲取主頁圖片 
  103.      */  
  104.     public Bitmap getHome(String photo){          
  105.         String homeName = photo + ".jpg";  
  106.         InputStream is=null;  
  107.           
  108.         try {  
  109.             is=getAssets().open("home/"+homeName);  
  110.             Bitmap bitmap = BitmapFactory.decodeStream(is);       
  111.             is.close();  
  112.             return bitmap;  
  113.         } catch (Exception e) {  
  114.             e.printStackTrace();  
  115.         }  
  116.          
  117.         return null;  
  118.   
  119.     }  
  120.     ////工具類  
  121.     /** 
  122.      *  
  123.      * @param inputStream 
  124.      * @return 
  125.      */  
  126.     public String readTextFile(InputStream inputStream) {  
  127.         String readedStr = "";  
  128.         BufferedReader br;  
  129.         try {  
  130.             br = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));  
  131.             String tmp;  
  132.             while ((tmp = br.readLine()) != null) {  
  133.                 readedStr += tmp;  
  134.             }  
  135.             br.close();  
  136.             inputStream.close();  
  137.         } catch (UnsupportedEncodingException e) {  
  138.             e.printStackTrace();  
  139.         } catch (IOException e) {  
  140.             e.printStackTrace();  
  141.         }  
  142.   
  143.         return readedStr;  
  144.     }  
  145. }  

四、講解如何實現的本地圖片綁定

我們在第二部分講了怎樣解析JSON數據,所以在看了全部代碼後,會出現一個問題,即:如何實現的JSON數據與IMG圖片實現的綁定呢。

這裏我們把相關的代碼提出來

1、在getView()函數中

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. @Override  
  2. public View getView(int position, View convertView, ViewGroup parent) {  
  3.       
  4.     ViewHolder holder = null;  
  5.     if (convertView == null) {  
  6.           
  7.         holder=new ViewHolder();    
  8.           
  9.         convertView = mInflater.inflate(R.layout.activity_main, null);  
  10.         holder.img = (ImageView)convertView.findViewById(R.id.img);  
  11.         holder.name = (TextView)convertView.findViewById(R.id.name);  
  12.         holder.info = (TextView)convertView.findViewById(R.id.info);  
  13.         convertView.setTag(holder);  
  14.           
  15.     }else {  
  16.           
  17.         holder = (ViewHolder)convertView.getTag();  
  18.     }  
  19.       
  20.     holder.img.setImageBitmap(getHome((String)mData.get(position).get("img")));  
  21.     holder.name.setText((String)mData.get(position).get("name"));  
  22.     holder.info.setText((String)mData.get(position).get("info"));  
  23.   
  24.     return convertView;  
  25. }  
注意:

1、

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. holder.img = (ImageView)convertView.findViewById(R.id.img);  
實現將XML元素與viewHolder綁定

2、

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. holder.img.setImageBitmap(getHome((String)mData.get(position).get("img")));  
注意這裏setImageBitmap()傳進去的是Bitmap類型數據,也即實現了將XML元素與本地的IMG圖片對應起來;這樣就實現的XML與本地圖片的綁定。

特別注意的是getHome()這個函數,我們知道mData是個list類型數據,通過mData.get(position).get("img")可能獲得存儲在mData中的與“img”這個KEY對應的文件名;

所以getHome()這個函數的功能就是傳進去JSON數據中photo字段對應的JPG文件的文件名;輸出的是這個文件名對應的Bitmap;

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. public Bitmap getHome(String photo){          
  2.     String homeName = photo + ".jpg";  
  3.     InputStream is=null;  
  4.       
  5.        try {  
  6.         is=getAssets().open("home/"+homeName);  
  7.            Bitmap bitmap = BitmapFactory.decodeStream(is);       
  8.            is.close();  
  9.            return bitmap;  
  10.        } catch (Exception e) {  
  11.            e.printStackTrace();  
  12.        }  
  13.         
  14.        return null;  
  15.   
  16. }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章