Chinaunix首页 | 论坛 | 博客
  • 博客访问: 53039
  • 博文数量: 18
  • 博客积分: 454
  • 博客等级: 下士
  • 技术积分: 165
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-08 22:40
文章分类
文章存档

2012年(18)

最近访客

分类: 嵌入式

2012-01-08 23:13:04


      上一篇完成用户首页的UI实现,本篇接下来讲功能部分的实现,本页面主要的功能就用户关注的最新微博列表,从上一篇中知道本列表是用ID为 Msglist的ListView控件来实现,本篇的主要就讲解如果获取微博列表数据给这个ListView提供显示数据。ListView每一条子数据分别由用户头像、用户昵称、发布时间、是否包含照片、微博内容这五部分组成,根据这五部分定义一个名为WeiBoInfo.java实体类,代码如下:

  1. public class WeiBoInfo {
  2.     //文章id
  3.     private String id;
  4.     public String getId(){
  5.         return id;
  6.     }
  7.     public void setId(String id){
  8.         this.id=id;
  9.     }
  10.     //发布人id
  11.     private String userId;
  12.     public String getUserId(){
  13.         return userId;
  14.     }
  15.     public void setUserId(String userId){
  16.         this.userId=userId;
  17.     }
  18.    
  19.     //发布人名字
  20.     private String userName;
  21.     public String getUserName(){
  22.         return userName;
  23.     }
  24.     public void setUserName(String userName){
  25.         this.userName=userName;
  26.     }
  27.    
  28.     //发布人头像
  29.     private String userIcon;
  30.     public String getUserIcon(){
  31.         return userIcon;
  32.     }
  33.     public void setUserIcon(String userIcon){
  34.         this.userIcon=userIcon;
  35.     }
  36.    
  37.     //发布时间
  38.     private String time;
  39.     public String getTime(){
  40.         return time;
  41.     }
  42.     public void setTime(String time)
  43.     {
  44.         this.time=time;
  45.     }
  46.    
  47.     //是否有图片
  48.     private Boolean haveImage=false;
  49.     public Boolean getHaveImage(){
  50.         return haveImage;
  51.     }
  52.     public void setHaveImage(Boolean haveImage){
  53.         this.haveImage=haveImage;
  54.     }
  55.    
  56.     //文章内容
  57.     private String text;
  58.     public String getText(){
  59.         return text;
  60.     }
  61.     public void setText(String text){
  62.         this.text=text;
  63.     }
  64.    
  65. }
复制代码
然后在res/layout目录下新建名为weibo.xml的Layout用来控制ListView子项的显示部件,代码很简单不多解释了,直接看下面代码:


  1.   xmlns:=""
  2.   android:layout_width="wrap_content"
  3.   android:layout_height="wrap_content"
  4.   android:orientation="horizontal">
  5.   
  6.   android:id="@+id/wbicon"
  7.   android:layout_width="wrap_content"
  8.   android:layout_height="wrap_content"
  9.   android:src="@drawable/usericon"
  10.   android:layout_margin="8px">
  11.   
  12.   
  13.   android:layout_width="fill_parent"
  14.   android:layout_height="wrap_content"
  15.   android:orientation="vertical"
  16.   android:paddingLeft="0px"
  17.   android:paddingRight="5px"
  18.   android:layout_marginTop="5px"
  19.   android:layout_marginBottom="5px">
  20.   
  21.   android:layout_width="fill_parent"
  22.   android:layout_height="wrap_content">
  23.   
  24.   android:id="@+id/wbuser"
  25.   android:layout_width="wrap_content"
  26.   android:layout_height="wrap_content"
  27.   android:textSize="15px"
  28.   android:textColor="#424952"
  29.   android:layout_alignParentLeft="true">
  30.   
  31.   
  32.   android:id="@+id/wbimage"
  33.   android:layout_width="wrap_content"
  34.   android:layout_height="wrap_content"
  35.   android:layout_marginTop="3px"
  36.   android:layout_marginRight="5px"
  37.   android:layout_toLeftOf="@+id/wbtime">
  38.   
  39.   
  40.   android:id="@+id/wbtime"
  41.   android:layout_width="wrap_content"
  42.   android:layout_height="wrap_content"
  43.   android:layout_alignParentRight="true"
  44.   android:textColor="#f7a200"
  45.   android:textSize="12px">
  46.   
  47.   
  48.   
  49.   android:id="@+id/wbtext"
  50.   android:layout_width="wrap_content"
  51.   android:layout_height="wrap_content"
  52.   android:textColor="#424952"
  53.   android:textSize="13px"
  54.   android:layout_marginTop="4px">
  55.   
  56.   
复制代码
接下来为列表控件定义一个数据Adapter,代码如下:


  1. private List wbList;

  2. //微博列表Adapater
  3.     public class WeiBoAdapater extends BaseAdapter{

  4.         private AsyncImageLoader asyncImageLoader;
  5.         
  6.         @Override
  7.         public int getCount() {
  8.             return wbList.size();
  9.         }

  10.         @Override
  11.         public Object getItem(int position) {
  12.             return wbList.get(position);
  13.         }

  14.         @Override
  15.         public long getItemId(int position) {
  16.             return position;
  17.         }

  18.         @Override
  19.         public View getView(int position, View convertView, ViewGroup parent) {
  20.             asyncImageLoader = new AsyncImageLoader();
  21.             convertView = LayoutInflater.from(getApplicationContext()).inflate(R.layout.weibo, null);
  22.             WeiBoHolder wh = new WeiBoHolder();
  23.             wh.wbicon = (ImageView) convertView.findViewById(R.id.wbicon);
  24.             wh.wbtext = (TextView) convertView.findViewById(R.id.wbtext);
  25.             wh.wbtime = (TextView) convertView.findViewById(R.id.wbtime);
  26.             wh.wbuser = (TextView) convertView.findViewById(R.id.wbuser);
  27.             wh.wbimage=(ImageView) convertView.findViewById(R.id.wbimage);
  28.             WeiBoInfo wb = wbList.get(position);
  29.             if(wb!=null){
  30.                 convertView.setTag(wb.getId());
  31.                 wh.wbuser.setText(wb.getUserName());
  32.                 wh.wbtime.setText(wb.getTime());
  33.                 wh.wbtext.setText(wb.getText(), TextView.BufferType.SPANNABLE);
  34.                 textHighlight(wh.wbtext,new char[]{'#'},new char[]{'#'});
  35.                 textHighlight(wh.wbtext,new char[]{'@'},new char[]{':',' '});
  36.                 textHighlight2(wh.wbtext,"http://"," ");
  37.                
  38.                 if(wb.getHaveImage()){
  39.                     wh.wbimage.setImageResource(R.drawable.images);
  40.                 }
  41.                 Drawable cachedImage = asyncImageLoader.loadDrawable(wb.getUserIcon(),wh.wbicon, new ImageCallback(){

  42.                     @Override
  43.                     public void imageLoaded(Drawable imageDrawable,ImageView imageView, String imageUrl) {
  44.                         imageView.setImageDrawable(imageDrawable);
  45.                     }
  46.                     
  47.                 });
  48.                  if (cachedImage == null) {
  49.                      wh.wbicon.setImageResource(R.drawable.usericon);
  50.                     }else{
  51.                         wh.wbicon.setImageDrawable(cachedImage);
  52.                     }
  53.             }
  54.             
  55.             return convertView;
  56.         }
复制代码
上面的这个Adapter实现没有什么特别的很普通,不过这个中使用了AsyncImageLoader的方法,这个是用来实现用户头像图标的异步载入显示,这样能提高列表显示的速度,提高用户体验,AsyncImageLoader的代码如下:

  1. public class AsyncImageLoader {
  2.     //SoftReference是软引用,是为了更好的为了系统回收变量
  3.     private HashMap> imageCache;
  4.     public AsyncImageLoader() {
  5.         imageCache = new HashMap>();
  6.     }
  7.    
  8.     public Drawable loadDrawable(final String imageUrl,final ImageView imageView, final ImageCallback imageCallback){
  9.         if (imageCache.containsKey(imageUrl)) {
  10.             //从缓存中获取
  11.             SoftReference softReference = imageCache.get(imageUrl);
  12.             Drawable drawable = softReference.get();
  13.             if (drawable != null) {
  14.                 return drawable;
  15.             }
  16.         }
  17.         final Handler handler = new Handler() {
  18.             public void handleMessage(Message message) {
  19.                 imageCallback.imageLoaded((Drawable) message.obj, imageView,imageUrl);
  20.             }
  21.         };
  22.         //建立新一个新的线程下载图片
  23.         new Thread() {
  24.             @Override
  25.             public void run() {
  26.                 Drawable drawable = loadImageFromUrl(imageUrl);
  27.                 imageCache.put(imageUrl, new SoftReference(drawable));
  28.                 Message message = handler.obtainMessage(0, drawable);
  29.                 handler.sendMessage(message);
  30.             }
  31.         }.start();
  32.         return null;
  33.     }
  34.    
  35.     public static Drawable loadImageFromUrl(String url){
  36.         URL m;
  37.         InputStream i = null;
  38.         try {
  39.             m = new URL(url);
  40.             i = (InputStream) m.getContent();
  41.         } catch (MalformedURLException e1) {
  42.             e1.printStackTrace();
  43.         } catch (IOException e) {
  44.             e.printStackTrace();
  45.         }
  46.         Drawable d = Drawable.createFromStream(i, "src");
  47.         return d;
  48.     }
  49.    
  50.     //回调接口
  51.     public interface ImageCallback {
  52.         public void imageLoaded(Drawable imageDrawable,ImageView imageView, String imageUrl);
  53.     }
  54. }
复制代码

完成上述的工作后,接下来就是显示微薄列表, 在HomeActivity的onCreate方法中调用loadList();代码如下:

  1. @Override
  2.     public void onCreate(Bundle savedInstanceState) {
  3.         super.onCreate(savedInstanceState);
  4.         setContentView(R.layout.home);
  5.         
  6.         。。。。。。
  7.         loadList();
  8.     }

  9. private void loadList(){
  10.         if(ConfigHelper.nowUser==null)
  11.         {
  12.             
  13.         }
  14.         else
  15.         {
  16.             user=ConfigHelper.nowUser;
  17.             //显示当前用户名称
  18.             TextView showName=(TextView)findViewById(R.id.showName);
  19.             showName.setText(user.getUserName());
  20.             
  21.             OAuth auth=new OAuth();
  22.             String url = "";
  23.             List params=new ArrayList();
  24.             params.add(new BasicNameValuePair("source", auth.consumerKey));
  25.             HttpResponse response =auth.SignRequest(user.getToken(), user.getTokenSecret(), url, params);
  26.             if (200 == response.getStatusLine().getStatusCode()){
  27.                 try {
  28.                     InputStream is = response.getEntity().getContent();
  29.                     Reader reader = new BufferedReader(new InputStreamReader(is), 4000);
  30.                     StringBuilder buffer = new StringBuilder((int) response.getEntity().getContentLength());
  31.                     try {
  32.                         char[] tmp = new char[1024];
  33.                         int l;
  34.                         while ((l = reader.read(tmp)) != -1) {
  35.                             buffer.append(tmp, 0, l);
  36.                         }
  37.                     } finally {
  38.                         reader.close();
  39.                     }
  40.                     String string = buffer.toString();
  41.                     //Log.e("json", "rs:" + string);
  42.                     response.getEntity().consumeContent();
  43.                     JSONArray data=new JSONArray(string);
  44.                     for(int i=0;i
  45.                     {
  46.                         JSONObject d=data.getJSONObject(i);
  47.                         //Log.e("json", "rs:" + d.getString("created_at"));
  48.                         if(d!=null){
  49.                             JSONObject u=d.getJSONObject("user");
  50.                             if(d.has("retweeted_status")){
  51.                                 JSONObject r=d.getJSONObject("retweeted_status");
  52.                             }
  53.                            
  54.                             //微博id
  55.                             String id=d.getString("id");
  56.                             String userId=u.getString("id");
  57.                             String userName=u.getString("screen_name");
  58.                             String userIcon=u.getString("profile_image_url");
  59.                             Log.e("userIcon", userIcon);
  60.                             String time=d.getString("created_at");
  61.                             String text=d.getString("text");
  62.                             Boolean haveImg=false;
  63.                             if(d.has("thumbnail_pic")){
  64.                                 haveImg=true;
  65.                                 //String thumbnail_pic=d.getString("thumbnail_pic");
  66.                                 //Log.e("thumbnail_pic", thumbnail_pic);
  67.                             }
  68.                            
  69.                             Date date=new Date(time);
  70.                             time=ConvertTime(date);
  71.                             if(wbList==null){
  72.                                 wbList=new ArrayList();
  73.                             }
  74.                             WeiBoInfo w=new WeiBoInfo();
  75.                             w.setId(id);
  76.                             w.setUserId(userId);
  77.                             w.setUserName(userName);
  78.                             w.setTime(time);
  79.                             w.setText(text);
  80.                            
  81.                             w.setHaveImage(haveImg);
  82.                             w.setUserIcon(userIcon);
  83.                             wbList.add(w);
  84.                         }
  85.                     }
  86.                     
  87.                 }catch (IllegalStateException e) {
  88.                     e.printStackTrace();
  89.                 } catch (IOException e) {
  90.                     e.printStackTrace();
  91.                 } catch (JSONException e) {
  92.                     e.printStackTrace();
  93.                 }
  94.             }
  95.             
  96.             if(wbList!=null)
  97.             {
  98.                 WeiBoAdapater adapater = new WeiBoAdapater();
  99.                 ListView Msglist=(ListView)findViewById(R.id.Msglist);
  100.                 Msglist.setOnItemClickListener(new OnItemClickListener(){
  101.                     @Override
  102.                     public void onItemClick(AdapterView arg0, View view,int arg2, long arg3) {
  103.                         Object obj=view.getTag();
  104.                         if(obj!=null){
  105.                             String id=obj.toString();
  106.                             Intent intent = new Intent(HomeActivity.this,ViewActivity.class);
  107.                             Bundle b=new Bundle();
  108.                             b.putString("key", id);
  109.                             intent.putExtras(b);
  110.                             startActivity(intent);
  111.                         }
  112.                     }
  113.                     
  114.                 });
  115.                 Msglist.setAdapter(adapater);
  116.             }
  117.         }
  118.         loadingLayout.setVisibility(View.GONE);
  119.     }
复制代码

上面的loadList() 方法通过新浪Api接口获取当前登录用户及其所关注用户的最新微博消息,然后显示到列表中。       这样就完成了用户首页功能的开发。
阅读(959) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~