Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> 實戰Android仿人人客戶端之新鮮事編碼實現(一)

實戰Android仿人人客戶端之新鮮事編碼實現(一)

編輯:Android開發實例

一、新鮮事的類別,各個數字值所代表的的含義:

         10 更新狀態的新鮮事; 11 page更新狀態的新鮮事; 20 發表日志的新鮮事; 21 分享日志的新鮮事; 22 page發表日志的新鮮事;23 page分享日志的新鮮事; 30 上傳照片的新鮮事; 31 page上傳照片的新鮮事; 32 分享照片的新鮮事; 33 分享相冊的新鮮事; 34 修改頭像的新鮮事; 35 page修改頭像的新鮮事; 36 page分享照片的新鮮事;40 為好友的新鮮事;41 為page粉絲的新鮮事;50 分享視頻的新鮮事;51 分享鏈接的新鮮事;52 分享音樂的新鮮事; 53 page分享視頻的新鮮事;54 page分享鏈接的新鮮事; 55 page分享音樂的新鮮事。

二、構建請求參數,發起網絡請求。

       構建請求參數,默認獲取所有類別的新鮮事,取第一頁(每一頁記錄數,默認值為30)。

  1. // 所有類別的新鮮事  
  2. String freshNewsAll = "10,11,20,21,22,23,31,32,33,34,35,36,40,41,50,51,52,53,54,55";  
  3.  
  4. Map<String, String> parameter = new HashMap<String, String>();  
  5. parameter.put("v", "1.0"); // API的版本號,固定值為1.0   
  6. parameter.put("access_token", accessToken); // OAuth2.0驗證授權後獲得的token。  
  7. parameter.put("format", "JSON"); // 返回值的格式。請指定為JSON或者XML  
  8. parameter.put("call_id", "2.0"); // 請求隊列號  
  9. parameter.put("method", "feed.get");  
  10. parameter.put("type", freshNewsAll); // 新鮮事的類別,多個類型以逗號分隔,type列表   
  11. parameter.put("uid", ""); // 支持傳入當前用戶的一個好友ID,表示獲取此好友的新鮮事,如果不傳,默認為獲取當前用戶的新鮮事   
  12. parameter.put("page", page + ""); // 支持分頁,指定頁號,頁號從1開始,默認值為1   
  13. parameter.put("count", pageCount + ""); // 支持分頁,每一頁記錄數,默認值為30,最大50   

        發起網絡請求

  1. AsyncHttpsPost asyncHttpsPost = new AsyncHttpsPost(Constant.API_SERVER_URL, parameter, new ParseCallback() {  
  2.       
  3.     @Override 
  4.     public Object parse(String json) throws JSONException {  
  5.         LogUtil.i("EveryoneActivity", "json = " + json);  
  6.           
  7.         return null;  
  8.     }  
  9. }, new ResultCallback() {  
  10.       
  11.     @Override 
  12.     public void onSuccess(Object obj) {  
  13.         // TODO Auto-generated method stub  
  14.           
  15.     }  
  16.       
  17.     @Override 
  18.     public void onFail(int errorCode) {  
  19.         // TODO Auto-generated method stub  
  20.           
  21.     }  
  22. });  
  23.  
  24. mDefaultThreadPool.execute(asyncHttpsPost);  
  25. mAsyncRequests.add(asyncHttpsPost);  

          注:Constant.API_SERVER_URL的值為https://api.renren.com/restserver.do(人人服務器URL(API Server URL))
 

       網絡請求返回的JSON字符串

  1. [  
  2.     {  
  3.         "actor_id":600038849,  
  4.         "actor_type":"page",  
  5.         "source_id":4680225717,  
  6.         "feed_type":11,  
  7.         "attachment":[],  
  8.         "post_id":21964215624,  
  9.         "headurl":"http:\/\/hdn.xnimg.cn\/photos\/hdn221\/20110212\/1700\/h_head_jMyd_4a320001f9f62f75.jpg",  
  10.         "message":"【北上廣墓位開始限售 市民為買墓半夜排隊】北京、上海、廣州等大型城市很多公墓都出現了墓地緊缺,開始限售墓位,有上海市民曾經半夜趕到了某陵園等候購買墓位,為了買一個位置去年幾乎忙了半年。民政部稱,全國大部分的省份現有的墓穴都將在10年內用完。",  
  11.         "title":"【北上廣墓位開始限售 市民為買墓半夜排隊】北京、上海、廣州等大型城市很多公墓都出現了墓地緊缺,開始限售墓位,有上海市民曾經半夜趕到了某陵園等候購買墓位,為了買一個位置去年幾乎忙了半年。民政部稱,全國大部分的省份現有的墓穴都將在10年內用完。",  
  12.         "update_time":"2013-04-03 18:19:46",  
  13.         "likes":{"friend_count":0,"user_like":0,"total_count":0},  
  14.         "name":"折翼の天使",  
  15.         "prefix":"【北上廣墓位開始限售 市民為買墓半夜排隊】北京、上海、廣州等大型城市很多公墓都出現了墓地緊缺,開始限售墓位,有上海市民曾經半夜趕到了某陵園等候購買墓位,為了買一個位置去年幾乎忙了半年。民政部稱,全國大部分的省份現有的墓穴都將在10年內用完。",  
  16.         "comments":  
  17.         {  
  18.             "count":19,  
  19.             "comment":  
  20.             [  
  21.                  {  
  22.                      "uid":257105823,  
  23.                      "comment_id":14762714581,  
  24.                      "time":"2013-04-03 18:21",  
  25.                      "text":"\"活著沒屋住 死了沒坑埋 \"",  
  26.                      "name":"接實 洗髓",  
  27.                      "headurl":"http:\/\/hdn.xnimg.cn\/photos\/hdn221\/20130331\/2125\/h_tiny_itUR_b7e600000fb5113e.jpg" 
  28.                    },  
  29.                    {  
  30.                        "uid":511348598,  
  31.                        "comment_id":14768302556,  
  32.                        "time":"2013-04-04 19:28",  
  33.                        "text":"\"你能受的聊嗎\"",  
  34.                        "name":"田思佳",  
  35.                        "headurl":"http:\/\/hdn.xnimg.cn\/photos\/hdn521\/20130222\/0835\/h_tiny_hEVJ_c680000009df111a.jpg" 
  36.                    }  
  37.             ]  
  38.          }           
  39.       }  
  40.   ]  

           構建實體類,對返回的JSON字符串進行解析。(這裡不明白的可以查看 實戰Android仿人人客戶端之通過HTTPS協議的POST方式獲取用戶的基本信息 )

  1. package com.everyone.android.entity;  
  2.  
  3. import java.util.ArrayList;  
  4.  
  5. /**  
  6.  * 功能描述:新鮮事信息實體類  
  7.  * @author android_ls  
  8.  *  
  9.  */ 
  10. public class FreshNews {  
  11.  
  12.     private int post_id; // 表示新鮮事的id   
  13.  
  14.     private int source_id; //  表示新鮮事內容主體的id,例如日志id、相冊id和分享id等等   
  15.  
  16.     private int feed_type; // 表示新鮮事類型  
  17.  
  18.     private String update_time; // 表示新鮮事更新時間   
  19.  
  20.     private int actor_id; //  表示新鮮事用戶的id   
  21.  
  22.     private String name; // 表示新鮮事用戶的姓名   
  23.  
  24.     private String actor_type; //  表示新鮮事發起者的類型,目前有“user”,“page”。user代表人人網用戶新鮮事,page代表公共主頁新鮮事。   
  25.  
  26.     private int headurl; //  表示新鮮事用戶的頭像   
  27.  
  28.     private String prefix; // 表示新鮮事內容的前綴  
  29.  
  30.     private String message; // 表示新鮮事用戶自定義輸入內容,狀態   
  31.  
  32.     private String title; //  表示新鮮事的主題內容    
  33.  
  34.     private String href; //  表示新鮮事主題的相關鏈接   
  35.  
  36.     private String description; //  表示新鮮事的具體內容   
  37.  
  38.     private ArrayList<Attachment> attachment; //  表示新鮮事中包含的媒體內容,例如照片、視頻等   
  39.  
  40.     private Like likes;// 表示贊相關的信息   
  41.  
  42.     private Source source; // 應該是來源信息 [官方文檔中的解釋:表示贊中好友的數量(不甚理解,什麼意思?)]  
  43.  
  44.     private Comments comments; //  表示新鮮事中包含的評論內容,目前返回最新和最早的評論   
  45.  
  46.     private Place place; // 表示新鮮事發生的地點   
  47.  
  48. }  

        新鮮事中包含的媒體(照片、視頻等)信息實體類

  1. package com.everyone.android.entity;  
  2.  
  3. /**  
  4.  * 功能描述:新鮮事中包含的媒體(照片、視頻等)信息實體類   
  5.  * @author android_ls  
  6.  *  
  7.  */ 
  8. public class Attachment {  
  9.  
  10.     private String href; // 表示媒體內容的鏈接地址feed_media子節點   
  11.  
  12.     private String media_type; // 表示媒體內容的類型,目前有“photo”, “album”, “link”, “video”, “audio”, “status” feed_media子節點   
  13.  
  14.     private String scr; //  表示媒體內容的原地址 feed_media子節點   
  15.  
  16.     private String raw_src; // media_type為“photo”時特有,代表未加工過的原圖URL。   
  17.  
  18.     private String content; // 表示媒體文本相關內容,例如:media_type為“status”代表狀態的內容;media_type為“photo”代表照片的描述信息。   
  19.  
  20.     private int media_id; //  表示媒體內容的id,例如相片的id feed_media子節點   
  21.  
  22.     private int owner_id; //  表示媒體內容的所有者idfeed_media子節點   
  23.  
  24. }  

        評論信息數據集實體類

  1. package com.everyone.android.entity;  
  2.  
  3. import java.util.ArrayList;  
  4.  
  5. /**  
  6.  * 功能描述:評論信息  
  7.  * @author android_ls  
  8.  *  
  9.  */ 
  10. public class Comments {  
  11.  
  12.     private int count; //  表示評論的數量 comments子節點   
  13.  
  14.     private ArrayList<Comment> comment; //  表示評論的具體內容comments子節點   
  15.  
  16. }  

        。。。

        剩余的幾個實體類的描述就不貼代碼了,主要的實體類的字段描述如上,至於生成get和set方法的事,我想大家都熟練(真正的體力活,呵呵)就不貼代碼,要不篇幅過於長了。實體類是參考官方的返回參數說明創建,地址:http://wiki.dev.renren.com/wiki/Feed.get,我們這裡關於JSON字符串解析的事和前面的處理一樣,使用谷歌提供的Gson進行解析。

  1. new ParseCallback() {  
  2.       
  3.     @Override 
  4.     public Object parse(String json) throws JSONException {  
  5.         LogUtil.i(TAG, "json = " + json);  
  6.           
  7.         Gson gson = new Gson();  
  8.         java.lang.reflect.Type type = new TypeToken<LinkedList<FreshNews>>() {}.getType();  
  9.         LinkedList<FreshNews> freshNewsList = gson.fromJson(json, type);  
  10.           
  11.         LogUtil.i(TAG, "freshNewsList = " + freshNewsList.size());  
  12.           
  13.         return freshNewsList;  
  14.     }  
  15. }  

           運行程序,耐心等待,過一會程序崩潰,LogCat打印LOG如下:

            仔細查看發現是JSON解析出錯了,解決思路:檢查你寫的實體類的字段是否與人人官方給出的字段類型一致,我仔細對比了一遍,沒錯啊。之後到Google的Android官網查看關於GSON的使用有什麼限制,發現原來使用GSON解析JSON時,對集合的類型是有限制的。將所有的實體類中的集合類型ArrayList修改為LinkedList,問題解決。

三、使用ListView展示數據

           1、布局文件(fresh_news.xml)如下:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:layout_width="fill_parent" 
  4.     android:layout_height="fill_parent" 
  5.     android:background="#FFFFFF" 
  6.     android:orientation="vertical" > 
  7.  
  8.     <com.everyone.android.widget.TopMenuNavbar 
  9.         android:id="@+id/rl_top_menu_navbar" 
  10.         style="@style/top_navbar" /> 
  11.  
  12.     <include 
  13.         android:id="@+id/loading" 
  14.         layout="@layout/loading_progressbar" /> 
  15.  
  16.     <include 
  17.         android:id="@+id/listview" 
  18.         android:layout_width="match_parent" 
  19.         android:layout_height="wrap_content" 
  20.         layout="@layout/listview" /> 
  21.  
  22. </LinearLayout> 

       include 的布局(listview.xml)文件如下:

  1. <ListView xmlns:android="http://schemas.android.com/apk/res/android" 
  2.     android:id="@+id/listview" 
  3.     android:layout_width="fill_parent" 
  4.     android:layout_height="wrap_content" 
  5.     android:background="#00000000" 
  6.     android:cacheColorHint="#00000000" 
  7.     android:divider="@drawable/v5_0_1_newsfeed_divider" 
  8.     android:listSelector="@null" /> 

     2、初始化ListView,設置數據適配器

  1. mListView = (ListView) freshNewsViewRoot.findViewById(R.id.listview);  
  2. mFreshNewsAdapter = new FreshNewsAdapter(mActivity, mFreshNewsList);  
  3. mListView.setAdapter(mFreshNewsAdapter); 

       3、數據適配器

           a. ListView的Item布局文件( fresh_news_list_item.xml),目前只處理了基本信息和新鮮事狀態相關的。

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:layout_width="fill_parent" 
  4.     android:layout_height="wrap_content" 
  5.     android:background="@drawable/fresh_news_list_item_selector" > 
  6.  
  7.     <!-- 頭像 --> 
  8.  
  9.     <ImageView 
  10.         android:id="@+id/iv_user_image" 
  11.         android:layout_width="43.0dip" 
  12.         android:layout_height="43.0dip" 
  13.         android:layout_marginLeft="10.0dip" 
  14.         android:layout_marginTop="8.0dip" 
  15.         android:saveEnabled="true" 
  16.         android:src="@drawable/v5_0_1_widget_default_head" /> 
  17.  
  18.     <LinearLayout 
  19.         android:layout_width="fill_parent" 
  20.         android:layout_height="wrap_content" 
  21.         android:layout_marginLeft="8dip" 
  22.         android:layout_marginRight="8dip" 
  23.         android:layout_marginTop="8dip" 
  24.         android:layout_toRightOf="@+id/iv_user_image" 
  25.         android:orientation="vertical" 
  26.         android:paddingBottom="8dip" > 
  27.  
  28.         <!-- 昵稱 --> 
  29.  
  30.         <TextView 
  31.             android:id="@+id/tv_nickname" 
  32.             android:layout_width="wrap_content" 
  33.             android:layout_height="wrap_content" 
  34.             android:textColor="#ff005092" 
  35.             android:textSize="16sp" /> 
  36.         <!-- 內容 --> 
  37.  
  38.         <TextView 
  39.             android:id="@+id/tv_content" 
  40.             android:layout_width="fill_parent" 
  41.             android:layout_height="wrap_content" 
  42.             android:layout_marginTop="5.0dip" 
  43.             android:textColor="#000000" 
  44.             android:textSize="15.0sp" /> 
  45.  
  46.         <!-- 更新狀態 --> 
  47.  
  48.         <LinearLayout 
  49.             android:id="@+id/ll_update_status" 
  50.             android:layout_width="fill_parent" 
  51.             android:layout_height="wrap_content" 
  52.             android:layout_alignLeft="@+id/tv_nickname" 
  53.             android:layout_below="@+id/tv_content" 
  54.             android:layout_marginTop="8dip" 
  55.             android:orientation="horizontal" 
  56.             android:visibility="gone" > 
  57.  
  58.             <View 
  59.                 android:layout_width="2dip" 
  60.                 android:layout_height="fill_parent" 
  61.                 android:background="#20333333" /> 
  62.  
  63.             <LinearLayout 
  64.                 android:layout_width="fill_parent" 
  65.                 android:layout_height="wrap_content" 
  66.                 android:layout_marginLeft="10dip" 
  67.                 android:orientation="vertical" > 
  68.  
  69.                 <TextView 
  70.                     android:id="@+id/tv_status_name" 
  71.                     android:layout_width="wrap_content" 
  72.                     android:layout_height="wrap_content" 
  73.                     android:textColor="#ff005092" 
  74.                     android:textSize="14sp" /> 
  75.  
  76.                 <TextView 
  77.                     android:id="@+id/tv_status_content" 
  78.                     android:layout_width="wrap_content" 
  79.                     android:layout_height="wrap_content" 
  80.                     android:layout_marginTop="10dip" 
  81.                     android:textColor="#ff888888" 
  82.                     android:textSize="13sp" /> 
  83.             </LinearLayout> 
  84.         </LinearLayout> 
  85.  
  86.         <RelativeLayout 
  87.             android:layout_width="fill_parent" 
  88.             android:layout_height="wrap_content" > 
  89.  
  90.             <!-- 時間 --> 
  91.  
  92.             <TextView 
  93.                 android:id="@+id/tv_published" 
  94.                 android:layout_width="wrap_content" 
  95.                 android:layout_height="wrap_content" 
  96.                 android:layout_marginTop="8.0dip" 
  97.                 android:drawablePadding="3dip" 
  98.                 android:textColor="#ff666666" 
  99.                 android:textSize="12.0sp" /> 
  100.  
  101.             <!-- 來源 --> 
  102.  
  103.             <TextView 
  104.                 android:id="@+id/tv_source" 
  105.                 android:layout_width="wrap_content" 
  106.                 android:layout_height="wrap_content" 
  107.                 android:layout_marginLeft="15dip" 
  108.                 android:layout_marginTop="8.0dip" 
  109.                 android:layout_toRightOf="@+id/tv_published" 
  110.                 android:textColor="#ff666666" 
  111.                 android:textSize="13.0sp" /> 
  112.         </RelativeLayout> 
  113.  
  114.         <!-- 用於顯示圖片 --> 
  115.  
  116.         <ImageView 
  117.             android:id="@+id/iv_content_picture" 
  118.             android:layout_width="wrap_content" 
  119.             android:layout_height="wrap_content" 
  120.             android:layout_marginTop="5.0dip" 
  121.             android:scaleType="fitXY" 
  122.             android:src="@drawable/pic_default" 
  123.             android:visibility="gone" /> 
  124.  
  125.         <!-- 評論信息 --> 
  126.  
  127.         <LinearLayout 
  128.             android:id="@+id/ll_comments_content" 
  129.             android:layout_width="fill_parent" 
  130.             android:layout_height="wrap_content" 
  131.             android:layout_marginTop="7.0dip" 
  132.             android:background="@drawable/fresh_news_popup" 
  133.             android:orientation="vertical" 
  134.             android:padding="10dip" 
  135.             android:visibility="gone" /> 
  136.     </LinearLayout> 
  137.  
  138. </RelativeLayout> 

        b. getView()方法裡面的處理,說下關鍵的幾點:

            設置姓名和圖像

  1. final FreshNews freshNews = mFreshNewsList.get(position);  
  2.    
  3.  // 姓名  
  4.  holder.text1.setText(freshNews.getName());  
  5.  
  6.  // 加載圖像  
  7.  String headurl = freshNews.getHeadurl();  
  8.  LogUtil.i(TAG, "headurl = " + headurl);  
  9.  if (!TextUtils.isEmpty(headurl)) {  
  10.      int widthPx = DensityUtil.dip2px(mActivity, 43);  
  11.      ImageInfo imgInfo = new ImageInfo(holder.imageView1, headurl, widthPx, widthPx);  
  12.      mImageLoader.displayImage(imgInfo);  
  13.  }  

              幾個比較難區分的字段

  1. /* 下面這幾個字段比較難區分,人人的官方文檔裡描述的不是很清楚,  
  2.      * 比如新鮮事內容的前綴在那種新鮮事類型下顯示等。  
  3.      * 我的做法是與人人官方的應用對比,猜測在某種類型下,可能取得是下面的某個字段的值。  
  4.      * 猜的話,很容易搞錯。  
  5.      */ 
  6.     String description = freshNews.getDescription();  
  7.     LogUtil.i(TAG, "description = " + description);  
  8.     LogUtil.i(TAG, "freshNews.getMessage() = " + freshNews.getMessage());  
  9.     LogUtil.i(TAG, "freshNews.getTitle() = " + freshNews.getTitle());  
  10.     LogUtil.i(TAG, "freshNews.getPrefix() = " + freshNews.getPrefix());  

             根據新鮮事類型做相應的處理

  1. // 用戶自定義輸入內容,狀態   
  2.      String message = freshNews.getMessage();  
  3.      if (!TextUtils.isEmpty(message)) {  
  4.          holder.text2.setVisibility(View.VISIBLE);  
  5.          holder.text2.setText(message);  
  6.      } else {  
  7.          holder.text2.setVisibility(View.GONE);  
  8.      }  
  9.        
  10.      // page代表公共主頁新鮮事  
  11.      int feedType = freshNews.getFeed_type();  
  12.      switch (feedType) {  
  13.      case 10: // 更新狀態的新鮮事。   
  14.      case 11: // page更新狀態的新鮮事。   
  15.  
  16.          // 設置狀態標識圖標  
  17.          holder.text3.setCompoundDrawablesWithIntrinsicBounds(R.drawable.v5_0_1_newsfeed_status_icon, 0, 0, 0);  
  18.  
  19.          // 內容的前綴  
  20.          String prefix = freshNews.getPrefix();  
  21.          if (!TextUtils.isEmpty(prefix)) {  
  22.              holder.text2.setVisibility(View.VISIBLE);  
  23.              holder.text2.setText(prefix);  
  24.          } else {  
  25.              holder.text2.setVisibility(View.GONE);  
  26.          }  
  27.            
  28.          LinkedList<Attachment> attachment = freshNews.getAttachment();  
  29.          if (attachment != null) {  
  30.              int size = attachment.size();  
  31.              LogUtil.i(TAG, "size = " + size);  
  32.              if(size > 0){  
  33.                  holder.linearLayout2.setVisibility(View.VISIBLE);  
  34.                  for (int i = 0; i < size; i++) {  
  35.                      // 這裡測試只取第一個  
  36.                      Attachment att = attachment.get(i);  
  37.                      if ("status".equals(att.getMedia_type())) {  
  38.                          LogUtil.i(TAG, "att.getContent() = " + att.getContent());  
  39.                            
  40.                          holder.text5.setText(att.getOwner_name());  
  41.                          holder.text6.setText(att.getContent());  
  42.                          break;  
  43.                      }  
  44.                  }  
  45.              } else {  
  46.                  holder.linearLayout2.setVisibility(View.GONE);  
  47.              }  
  48.          } else {  
  49.              holder.linearLayout2.setVisibility(View.GONE);  
  50.          }  
  51.  
  52.          break;  
  53.      case 20: // 發表日志的新鮮事。   
  54.      case 22: // page發表日志的新鮮事。   
  55.            
  56.          break;  
  57.      case 21: // 分享日志的新鮮事。   
  58.      case 23: // page分享日志的新鮮事。   
  59.  
  60.          break;  
  61.      case 30: // 上傳照片的新鮮事。  
  62.      case 31: // page上傳照片的新鮮事。    
  63.  
  64.          break;  
  65.      case 32: // 分享照片的新鮮事。   
  66.      case 33: // 分享相冊的新鮮事。    
  67.  
  68.          break;  
  69.      // ...  
  70.      default:  
  71.          break;  
  72.      }  

          動態生成顯示評論信息的Item

  1. // 動態生成顯示評論信息的Item  
  2. Comments comments = freshNews.getComments();  
  3. if (comments != null) {  
  4.     LinkedList<Comment> commentList = comments.getComment();  
  5.     if (commentList != null) {  
  6.         holder.linearLayout1.setVisibility(View.VISIBLE);  
  7.           
  8.         if(holder.linearLayout1.getChildCount() > 0){  
  9.             holder.linearLayout1.removeAllViews();  
  10.         }  
  11.           
  12.         int count = comments.getCount();  
  13.         if (count > 0) {  
  14.             TextView tvCount = new TextView(mActivity);  
  15.             tvCount.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));  
  16.             tvCount.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);  
  17.             tvCount.setSingleLine();  
  18.             tvCount.setCompoundDrawablePadding(5);  
  19.             tvCount.setPadding(0, 10, 0, 0);  
  20.             tvCount.setText(count + "條評論");  
  21.             tvCount.setTextColor(Color.parseColor("#ff005092"));  
  22.             tvCount.setCompoundDrawablesWithIntrinsicBounds(R.drawable.fresh_news_comment_icon, 0, 0, 0);  
  23.             holder.linearLayout1.addView(tvCount);  
  24.         }  
  25.           
  26.         int size = commentList.size();  
  27.         LogUtil.i(TAG, "commentList size = " + size);  
  28.         for (int i = 0; i < size; i++) {  
  29.             Comment comment = commentList.get(i);  
  30.             LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);  
  31.  
  32.             TextView tvContent = new TextView(mActivity);  
  33.             tvContent.setLayoutParams(layoutParams);  
  34.             tvContent.setTextColor(Color.BLACK);  
  35.             tvContent.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);  
  36.             tvContent.setSingleLine();  
  37.             tvContent.setPadding(0, 10, 0, 0);  
  38.             tvContent.setText(comment.getName() + ":" + comment.getText());  
  39.             holder.linearLayout1.addView(tvContent);  
  40.  
  41.             TextView tvTime = new TextView(mActivity);  
  42.             tvTime.setTextColor(Color.GRAY);  
  43.             tvTime.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12);  
  44.             tvTime.setLayoutParams(layoutParams);  
  45.             tvContent.setPadding(0, 5, 0, 10);  
  46.             tvTime.setText(comment.getTime());  
  47.             holder.linearLayout1.addView(tvTime);  
  48.         }  
  49.          
  50.     } else {  
  51.         holder.linearLayout1.setVisibility(View.GONE);  
  52.     }  
  53. } else {  
  54.     holder.linearLayout1.setVisibility(View.GONE);  
  55. }  

          時間與來源

  1. // 對獲取的時間字符串的處理  
  2.    String updateTime = freshNews.getUpdate_time();  
  3.    if (!TextUtils.isEmpty(updateTime)) {  
  4.        updateTime = updateTime.substring(updateTime.indexOf("-")+1, updateTime.lastIndexOf(":"));  
  5.        updateTime = updateTime.replace("-", "月");  
  6.        updateTime = updateTime.replace(" ", "日 ");  
  7.        int index = updateTime.indexOf("0");  
  8.        if(index == 0){  
  9.            updateTime = updateTime.substring(index + 1);  
  10.        }  
  11.          
  12.        holder.text3.setText(updateTime);  
  13.    }  
  14.      
  15.    // 來自那種客戶端  
  16.    Source source = freshNews.getSource();  
  17.    if (source != null) {  
  18.        holder.text4.setText("來自:" + source.getText());  
  19.    }  

  四、運行後的效果圖 

 

     點擊頂部左側的Menu

 

 

         更新狀態的顯示效果圖




五、完整的代碼

新鮮事視圖(FreshNewsLayout)

  1. package com.everyone.android.freshnews;  
  2.  
  3. import java.util.HashMap;  
  4. import java.util.LinkedList;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7.  
  8. import org.json.JSONException;  
  9.  
  10. import android.os.Handler;  
  11. import android.view.LayoutInflater;  
  12. import android.view.View;  
  13. import android.view.View.OnClickListener;  
  14. import android.widget.AbsListView;  
  15. import android.widget.AbsListView.OnScrollListener;  
  16. import android.widget.FrameLayout;  
  17. import android.widget.LinearLayout;  
  18. import android.widget.ListView;  
  19.  
  20. import com.everyone.android.R;  
  21. import com.everyone.android.api.AuthTokenManager;  
  22. import com.everyone.android.callback.ParseCallback;  
  23. import com.everyone.android.callback.ResultCallback;  
  24. import com.everyone.android.entity.FreshNews;  
  25. import com.everyone.android.net.AsyncBaseRequest;  
  26. import com.everyone.android.net.AsyncHttpsPost;  
  27. import com.everyone.android.net.DefaultThreadPool;  
  28. import com.everyone.android.ui.EveryoneActivity;  
  29. import com.everyone.android.utils.Constant;  
  30. import com.everyone.android.utils.LogUtil;  
  31. import com.everyone.android.widget.TopMenuNavbar;  
  32. import com.google.gson.Gson;  
  33. import com.google.gson.reflect.TypeToken;  
  34.  
  35. /**  
  36.  * 功能描述:新鮮事視圖  
  37.  * @author android_ls  
  38.  */ 
  39. public class FreshNewsLayout extends FrameLayout implements OnClickListener {  
  40.  
  41.     /**  
  42.      * LOG打印標簽  
  43.      */ 
  44.     private static final String TAG = "FreshNewsLayout";  
  45.  
  46.     /**  
  47.      * 頂部導航欄(工具欄)  
  48.      */ 
  49.     private TopMenuNavbar topMenuNavbar;  
  50.  
  51.     /**  
  52.      * 所有類別的新鮮事  
  53.      */ 
  54.     private static final String FRESH_NEWS_TYPE_ALL = "10,11,20,21,22,23,31,32,33,34,35,36,40,41,50,51,52,53,54,55";  
  55.  
  56.     /**  
  57.      * 每一頁記錄數,默認值為30,最大50   
  58.      */ 
  59.     private int pageCount = 30;  
  60.  
  61.     /**  
  62.      * 當前獲取第幾頁,默認值為1  
  63.      */ 
  64.     private int page = 1;  
  65.  
  66.     public TopMenuNavbar getTopMenuNavbar() {  
  67.         return topMenuNavbar;  
  68.     }  
  69.  
  70.     private EveryoneActivity mActivity;  
  71.  
  72.     private List<AsyncBaseRequest> mAsyncRequests;  
  73.  
  74.     private DefaultThreadPool mDefaultThreadPool;  
  75.  
  76.     private Handler mHandler;  
  77.  
  78.     public AuthTokenManager mAuthTokenManager;  
  79.  
  80.     private LinearLayout mLoadingView;  
  81.  
  82.     private ListView mListView;  
  83.  
  84.     private FreshNewsAdapter mFreshNewsAdapter;  
  85.  
  86.     /**  
  87.      * 新鮮事信息集合  
  88.      */ 
  89.     private LinkedList<FreshNews> mFreshNewsList = new LinkedList<FreshNews>();  
  90.  
  91.     public FreshNewsLayout(EveryoneActivity activity) {  
  92.         super(activity);  
  93.         mActivity = activity;  
  94.  
  95.         this.mAsyncRequests = activity.getAsyncRequests();  
  96.         this.mDefaultThreadPool = activity.getDefaultThreadPool();  
  97.         this.mHandler = activity.getHandler();  
  98.         this.mAuthTokenManager = activity.getAuthTokenManager();  
  99.  
  100.         setupViews();  
  101.     }  
  102.  
  103.     /*  public FreshNewsLayout(Context context, AttributeSet attrs) {  
  104.           super(context, attrs);  
  105.           setupViews();  
  106.       }*/ 
  107.  
  108.     private void setupViews() {  
  109.         final LayoutInflater mLayoutInflater = LayoutInflater.from(getContext());  
  110.         LinearLayout freshNewsViewRoot = (LinearLayout) mLayoutInflater.inflate(R.layout.fresh_news, null);  
  111.         addView(freshNewsViewRoot);  
  112.  
  113.         // 加載提示進度條  
  114.         mLoadingView = (LinearLayout) freshNewsViewRoot.findViewById(R.id.loading);  
  115.  
  116.         topMenuNavbar = (TopMenuNavbar) freshNewsViewRoot.findViewById(R.id.rl_top_menu_navbar);  
  117.         topMenuNavbar.mLlDownList.setOnClickListener(this);  
  118.         topMenuNavbar.mLlRefresh.setOnClickListener(this);  
  119.         topMenuNavbar.ivRightLine.setVisibility(View.GONE);  
  120.         topMenuNavbar.tvRightOperationName.setVisibility(View.GONE);  
  121.  
  122.         mListView = (ListView) freshNewsViewRoot.findViewById(R.id.listview);  
  123.         mFreshNewsAdapter = new FreshNewsAdapter(mActivity, mFreshNewsList);  
  124.         mListView.setAdapter(mFreshNewsAdapter);  
  125.  
  126.         // TODO 這裡暫時簡單的這樣處理  
  127.         mListView.setOnScrollListener(new OnScrollListener() {  
  128.  
  129.             public void onScrollStateChanged(AbsListView view, int scrollState) {  
  130.                 if (view.getLastVisiblePosition() == view.getCount() - 1) {  
  131.                     page++;  
  132.                     getNewsAll();  
  133.                 }  
  134.             }  
  135.  
  136.             public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {  
  137.  
  138.             }  
  139.         });  
  140.  
  141.     }  
  142.  
  143.     @Override 
  144.     public void onClick(View v) {  
  145.         switch (v.getId()) {  
  146.         case R.id.ll_down_list:  
  147.  
  148.             break;  
  149.         case R.id.ll_refresh:  
  150.  
  151.             break;  
  152.         default:  
  153.             break;  
  154.         }  
  155.  
  156.     }  
  157.  
  158.     /**  
  159.      * 向服務器端請求新鮮事的數據  
  160.      */ 
  161.     public void getNewsAll() {  
  162.         String accessToken = mAuthTokenManager.getAccessToken();  
  163.         LogUtil.e(TAG, "accessToken = " + accessToken);  
  164.  
  165.         Map<String, String> parameter = new HashMap<String, String>();  
  166.         parameter.put("v", "1.0"); // API的版本號,固定值為1.0   
  167.         parameter.put("access_token", accessToken); // OAuth2.0驗證授權後獲得的token。  
  168.         parameter.put("format", "JSON"); // 返回值的格式。請指定為JSON或者XML  
  169.         parameter.put("call_id", "1.0"); // 請求隊列號  
  170.         parameter.put("method", "feed.get");  
  171.         parameter.put("type", FRESH_NEWS_TYPE_ALL); // 新鮮事的類別,多個類型以逗號分隔,type列表   
  172.         // parameter.put("uid", ""); // 支持傳入當前用戶的一個好友ID,表示獲取此好友的新鮮事,如果不傳,默認為獲取當前用戶的新鮮事   
  173.         parameter.put("page", page + ""); // 支持分頁,指定頁號,頁號從1開始,默認值為1   
  174.         parameter.put("count", pageCount + ""); // 支持分頁,每一頁記錄數,默認值為30,最大50   
  175.         AsyncHttpsPost asyncHttpsPost = new AsyncHttpsPost(Constant.API_SERVER_URL, parameter, new ParseCallback() {  
  176.  
  177.             @Override 
  178.             public Object parse(String json) throws JSONException {  
  179.                 LogUtil.i(TAG, "json = " + json);  
  180.  
  181.                 Gson gson = new Gson();  
  182.                 java.lang.reflect.Type type = new TypeToken<LinkedList<FreshNews>>() {  
  183.                 }.getType();  
  184.                 LinkedList<FreshNews> freshNewsList = gson.fromJson(json, type);  
  185.  
  186.                 LogUtil.i(TAG, "freshNewsList = " + freshNewsList.size());  
  187.  
  188.                 return freshNewsList;  
  189.             }  
  190.         }, new ResultCallback() {  
  191.  
  192.             @Override 
  193.             public void onSuccess(Object obj) {  
  194.                 @SuppressWarnings("unchecked")  
  195.                 LinkedList<FreshNews> freshNewsList = (LinkedList<FreshNews>) obj;  
  196.                 if (freshNewsList.isEmpty()) {  
  197.                     return;  
  198.                 }  
  199.  
  200.                 mFreshNewsList.addAll(freshNewsList);  
  201.  
  202.                 mHandler.post(new Runnable() {  
  203.  
  204.                     @Override 
  205.                     public void run() {  
  206.                         mLoadingView.setVisibility(View.GONE);  
  207.                         mFreshNewsAdapter.notifyDataSetChanged();  
  208.                     }  
  209.                 });  
  210.  
  211.             }  
  212.  
  213.             @Override 
  214.             public void onFail(int errorCode) {  
  215.                 // TODO Auto-generated method stub  
  216.  
  217.             }  
  218.         });  
  219.  
  220.         mDefaultThreadPool.execute(asyncHttpsPost);  
  221.         mAsyncRequests.add(asyncHttpsPost);  
  222.     }  
  223.  
  224. }  
  225.  

新鮮事列表數據適配器(FreshNewsAdapter)

  1. package com.everyone.android.freshnews;  
  2.  
  3. import java.util.LinkedList;  
  4.  
  5. import android.graphics.Color;  
  6. import android.text.TextUtils;  
  7. import android.util.TypedValue;  
  8. import android.view.LayoutInflater;  
  9. import android.view.View;  
  10. import android.view.ViewGroup;  
  11. import android.view.ViewGroup.LayoutParams;  
  12. import android.widget.BaseAdapter;  
  13. import android.widget.ImageView;  
  14. import android.widget.LinearLayout;  
  15. import android.widget.TextView;  
  16.  
  17. import com.everyone.android.R;  
  18. import com.everyone.android.bitmap.ImageLoader;  
  19. import com.everyone.android.entity.Attachment;  
  20. import com.everyone.android.entity.Comment;  
  21. import com.everyone.android.entity.Comments;  
  22. import com.everyone.android.entity.FreshNews;  
  23. import com.everyone.android.entity.ImageInfo;  
  24. import com.everyone.android.entity.Source;  
  25. import com.everyone.android.ui.EveryoneActivity;  
  26. import com.everyone.android.utils.DensityUtil;  
  27. import com.everyone.android.utils.LogUtil;  
  28.  
  29. /**  
  30.  * 功能描述:新鮮事列表數據適配器  
  31.  * @author android_ls  
  32.  */ 
  33. public class FreshNewsAdapter extends BaseAdapter {  
  34.     /**  
  35.      * LOG打印標簽  
  36.      */ 
  37.     private static final String TAG = "FreshNewsAdapter";  
  38.  
  39.     private LayoutInflater inflater;  
  40.  
  41.     private LinkedList<FreshNews> mFreshNewsList;  
  42.  
  43.     private EveryoneActivity mActivity;  
  44.  
  45.     private ImageLoader mImageLoader;  
  46.  
  47.     public FreshNewsAdapter(EveryoneActivity activity, LinkedList<FreshNews> freshNewsList) {  
  48.         inflater = LayoutInflater.from(activity);  
  49.         mActivity = activity;  
  50.         mFreshNewsList = freshNewsList;  
  51.         this.mImageLoader = new ImageLoader(mActivity);  
  52.     }  
  53.  
  54.     @Override 
  55.     public int getCount() {  
  56.         return mFreshNewsList.size();  
  57.     }  
  58.  
  59.     @Override 
  60.     public Object getItem(int arg0) {  
  61.         return mFreshNewsList.get(arg0);  
  62.     }  
  63.  
  64.     @Override 
  65.     public long getItemId(int position) {  
  66.         return position;  
  67.     }  
  68.  
  69.     @Override 
  70.     public View getView(final int position, View convertView, ViewGroup parent) {  
  71.         ViewHolder holder = null;  
  72.         if (convertView == null) {  
  73.             convertView = inflater.inflate(R.layout.fresh_news_list_item, null);  
  74.             holder = new ViewHolder();  
  75.             holder.imageView1 = (ImageView) convertView.findViewById(R.id.iv_user_image);  
  76.             holder.text1 = (TextView) convertView.findViewById(R.id.tv_nickname);  
  77.  
  78.             holder.text2 = (TextView) convertView.findViewById(R.id.tv_content);  
  79.             holder.imageView2 = (ImageView) convertView.findViewById(R.id.iv_content_picture);  
  80.  
  81.             holder.linearLayout1 = (LinearLayout) convertView.findViewById(R.id.ll_comments_content);  
  82.             holder.linearLayout2 = (LinearLayout) convertView.findViewById(R.id.ll_update_status);  
  83.  
  84.             holder.text3 = (TextView) convertView.findViewById(R.id.tv_published);  
  85.             holder.text4 = (TextView) convertView.findViewById(R.id.tv_source);  
  86.  
  87.             holder.text5 = (TextView) convertView.findViewById(R.id.tv_status_name);  
  88.             holder.text6 = (TextView) convertView.findViewById(R.id.tv_status_content);  
  89.  
  90.             convertView.setTag(holder);  
  91.         } else {  
  92.             holder = (ViewHolder) convertView.getTag();  
  93.         }  
  94.  
  95.         final FreshNews freshNews = mFreshNewsList.get(position);  
  96.  
  97.         // 姓名  
  98.         holder.text1.setText(freshNews.getName());  
  99.  
  100.         // 加載圖像  
  101.         String headurl = freshNews.getHeadurl();  
  102.         LogUtil.i(TAG, "headurl = " + headurl);  
  103.         if (!TextUtils.isEmpty(headurl)) {  
  104.             int widthPx = DensityUtil.dip2px(mActivity, 43);  
  105.             ImageInfo imgInfo = new ImageInfo(holder.imageView1, headurl, widthPx, widthPx);  
  106.             mImageLoader.displayImage(imgInfo);  
  107.         }  
  108.  
  109.         /* 下面這幾個字段比較難區分,人人的官方文檔裡描述的不是很清楚,  
  110.          * 比如新鮮事內容的前綴在那種新鮮事類型下顯示等。  
  111.          * 我的做法是與人人官方的應用對比,猜測在某種類型下,可能取得是下面的某個字段的值。  
  112.          * 猜的話,很容易搞錯。  
  113.          */ 
  114.         String description = freshNews.getDescription();  
  115.         LogUtil.i(TAG, "description = " + description);  
  116.         LogUtil.i(TAG, "freshNews.getMessage() = " + freshNews.getMessage());  
  117.         LogUtil.i(TAG, "freshNews.getTitle() = " + freshNews.getTitle());  
  118.         LogUtil.i(TAG, "freshNews.getPrefix() = " + freshNews.getPrefix());  
  119.  
  120.         // 用戶自定義輸入內容,狀態   
  121.         String message = freshNews.getMessage();  
  122.         if (!TextUtils.isEmpty(message)) {  
  123.             holder.text2.setVisibility(View.VISIBLE);  
  124.             holder.text2.setText(message);  
  125.         } else {  
  126.             holder.text2.setVisibility(View.GONE);  
  127.         }  
  128.  
  129.         // page代表公共主頁新鮮事  
  130.         int feedType = freshNews.getFeed_type();  
  131.         switch (feedType) {  
  132.         case 10: // 更新狀態的新鮮事。   
  133.         case 11: // page更新狀態的新鮮事。   
  134.  
  135.             // 設置狀態標識圖標  
  136.             holder.text3.setCompoundDrawablesWithIntrinsicBounds(R.drawable.v5_0_1_newsfeed_status_icon, 0, 0, 0);  
  137.  
  138.             // 內容的前綴  
  139.             String prefix = freshNews.getPrefix();  
  140.             if (!TextUtils.isEmpty(prefix)) {  
  141.                 holder.text2.setVisibility(View.VISIBLE);  
  142.                 holder.text2.setText(prefix);  
  143.             } else {  
  144.                 holder.text2.setVisibility(View.GONE);  
  145.             }  
  146.  
  147.             LinkedList<Attachment> attachment = freshNews.getAttachment();  
  148.             if (attachment != null) {  
  149.                 int size = attachment.size();  
  150.                 LogUtil.i(TAG, "size = " + size);  
  151.                 if (size > 0) {  
  152.                     holder.linearLayout2.setVisibility(View.VISIBLE);  
  153.                     for (int i = 0; i < size; i++) {  
  154.                         // 這裡測試只取第一個  
  155.                         Attachment att = attachment.get(i);  
  156.                         if ("status".equals(att.getMedia_type())) {  
  157.                             LogUtil.i(TAG, "att.getContent() = " + att.getContent());  
  158.  
  159.                             holder.text5.setText(att.getOwner_name());  
  160.                             holder.text6.setText(att.getContent());  
  161.                             break;  
  162.                         }  
  163.                     }  
  164.                 } else {  
  165.                     holder.linearLayout2.setVisibility(View.GONE);  
  166.                 }  
  167.             } else {  
  168.                 holder.linearLayout2.setVisibility(View.GONE);  
  169.             }  
  170.  
  171.             break;  
  172.         case 20: // 發表日志的新鮮事。   
  173.         case 22: // page發表日志的新鮮事。   
  174.  
  175.             break;  
  176.         case 21: // 分享日志的新鮮事。   
  177.         case 23: // page分享日志的新鮮事。   
  178.  
  179.             break;  
  180.         case 30: // 上傳照片的新鮮事。  
  181.         case 31: // page上傳照片的新鮮事。    
  182.  
  183.             break;  
  184.         case 32: // 分享照片的新鮮事。   
  185.         case 33: // 分享相冊的新鮮事。    
  186.  
  187.             break;  
  188.         // ...  
  189.         default:  
  190.             break;  
  191.         }  
  192.  
  193.         // 動態生成顯示評論信息的Item  
  194.         Comments comments = freshNews.getComments();  
  195.         if (comments != null) {  
  196.             LinkedList<Comment> commentList = comments.getComment();  
  197.             if (commentList != null) {  
  198.                 holder.linearLayout1.setVisibility(View.VISIBLE);  
  199.  
  200.                 if (holder.linearLayout1.getChildCount() > 0) {  
  201.                     holder.linearLayout1.removeAllViews();  
  202.                 }  
  203.  
  204.                 int count = comments.getCount();  
  205.                 if (count > 0) {  
  206.                     TextView tvCount = new TextView(mActivity);  
  207.                     tvCount.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));  
  208.                     tvCount.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);  
  209.                     tvCount.setSingleLine();  
  210.                     tvCount.setCompoundDrawablePadding(5);  
  211.                     tvCount.setPadding(0, 10, 0, 0);  
  212.                     tvCount.setText(count + "條評論");  
  213.                     tvCount.setTextColor(Color.parseColor("#ff005092"));  
  214.                     tvCount.setCompoundDrawablesWithIntrinsicBounds(R.drawable.fresh_news_comment_icon, 0, 0, 0);  
  215.                     holder.linearLayout1.addView(tvCount);  
  216.                 }  
  217.  
  218.                 int size = commentList.size();  
  219.                 LogUtil.i(TAG, "commentList size = " + size);  
  220.                 for (int i = 0; i < size; i++) {  
  221.                     Comment comment = commentList.get(i);  
  222.                     LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);  
  223.  
  224.                     TextView tvContent = new TextView(mActivity);  
  225.                     tvContent.setLayoutParams(layoutParams);  
  226.                     tvContent.setTextColor(Color.BLACK);  
  227.                     tvContent.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);  
  228.                     tvContent.setSingleLine();  
  229.                     tvContent.setPadding(0, 10, 0, 0);  
  230.                     tvContent.setText(comment.getName() + ":" + comment.getText());  
  231.                     holder.linearLayout1.addView(tvContent);  
  232.  
  233.                     TextView tvTime = new TextView(mActivity);  
  234.                     tvTime.setTextColor(Color.GRAY);  
  235.                     tvTime.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12);  
  236.                     tvTime.setLayoutParams(layoutParams);  
  237.                     tvContent.setPadding(0, 5, 0, 10);  
  238.                     tvTime.setText(comment.getTime());  
  239.                     holder.linearLayout1.addView(tvTime);  
  240.                 }  
  241.  
  242.             } else {  
  243.                 holder.linearLayout1.setVisibility(View.GONE);  
  244.             }  
  245.         } else {  
  246.             holder.linearLayout1.setVisibility(View.GONE);  
  247.         }  
  248.  
  249.         // 對獲取的時間字符串的處理  
  250.         String updateTime = freshNews.getUpdate_time();  
  251.         if (!TextUtils.isEmpty(updateTime)) {  
  252.             updateTime = updateTime.substring(updateTime.indexOf("-") + 1, updateTime.lastIndexOf(":"));  
  253.             updateTime = updateTime.replace("-", "月");  
  254.             updateTime = updateTime.replace(" ", "日 ");  
  255.             int index = updateTime.indexOf("0");  
  256.             if (index == 0) {  
  257.                 updateTime = updateTime.substring(index + 1);  
  258.             }  
  259.  
  260.             holder.text3.setText(updateTime);  
  261.         }  
  262.  
  263.         // 來自那種客戶端  
  264.         Source source = freshNews.getSource();  
  265.         if (source != null) {  
  266.             holder.text4.setText("來自:" + source.getText());  
  267.         }  
  268.  
  269.         return convertView;  
  270.     }  
  271.  
  272.     static class ViewHolder {  
  273.  
  274.         public LinearLayout linearLayout1;  
  275.  
  276.         public LinearLayout linearLayout2;  
  277.  
  278.         public ImageView imageView1;  
  279.  
  280.         public ImageView imageView2;  
  281.  
  282.         public TextView text1;  
  283.  
  284.         public TextView text2;  
  285.  
  286.         public TextView text3;  
  287.  
  288.         public TextView text4;  
  289.  
  290.         public TextView text5;  
  291.  
  292.         public TextView text6;  
  293.     }  
  294. }  

轉自:http://blog.csdn.net/android_ls/article/details/8815622

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved