weibo9

随笔- 74  文章- 0  评论- 1181 

android开发我的新浪微博客户端-用户首页面功能篇(5.2)

weibo9 

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

weibo9 代码
public   class  WeiBoInfo {
    
// 文章id
     private  String id;
    
public  String getId(){
        
return  id;
    }
    
public   void  setId(String id){
        
this .id = id;
    }
    
// 发布人id
     private  String userId;
    
public  String getUserId(){
        
return  userId;
    }
    
public   void  setUserId(String userId){
        
this .userId = userId;
    }
    
    
// 发布人名字
     private  String userName;
    
public  String getUserName(){
        
return  userName;
    }
    
public   void  setUserName(String userName){
        
this .userName = userName;
    }
    
    
// 发布人头像
     private  String userIcon;
    
public  String getUserIcon(){
        
return  userIcon;
    }
    
public   void  setUserIcon(String userIcon){
        
this .userIcon = userIcon;
    }
    
    
// 发布时间
     private  String time;
    
public  String getTime(){
        
return  time;
    }
    
public   void  setTime(String time)
    {
        
this .time = time;
    }
    
    
// 是否有图片
     private  Boolean haveImage = false ;
    
public  Boolean getHaveImage(){
        
return  haveImage;
    }
    
public   void  setHaveImage(Boolean haveImage){
        
this .haveImage = haveImage;
    }
    
    
// 文章内容
     private  String text;
    
public  String getText(){
        
return  text;
    }
    
public   void  setText(String text){
        
this .text = text;
    }
    
}

     然后在res/layout目录下新建名为weibo.xml的Layout用来控制ListView子项的显示部件,代码很简单不多解释了,直接看下面代码:

weibo9 代码
<? xml version="1.0" encoding="utf-8" ?>
< LinearLayout
  
xmlns:android ="http://schemas.android.com/apk/res/android"
  android:layout_width
="wrap_content"
  android:layout_height
="wrap_content"
  android:orientation
="horizontal" >
  
< ImageView
  
android:id ="@+id/wbicon"
  android:layout_width
="wrap_content"
  android:layout_height
="wrap_content"
  android:src
="@drawable/usericon"
  android:layout_margin
="8px" >
  
</ ImageView >
  
< LinearLayout
  
android:layout_width ="fill_parent"
  android:layout_height
="wrap_content"
  android:orientation
="vertical"
  android:paddingLeft
="0px"
  android:paddingRight
="5px"
  android:layout_marginTop
="5px"
  android:layout_marginBottom
="5px" >
  
< RelativeLayout
  
android:layout_width ="fill_parent"
  android:layout_height
="wrap_content" >
  
< TextView
  
android:id ="@+id/wbuser"
  android:layout_width
="wrap_content"
  android:layout_height
="wrap_content"
  android:textSize
="15px"
  android:textColor
="#424952"
  android:layout_alignParentLeft
="true" >
  
</ TextView >
  
< ImageView
  
android:id ="@+id/wbimage"
  android:layout_width
="wrap_content"
  android:layout_height
="wrap_content"
  android:layout_marginTop
="3px"
  android:layout_marginRight
="5px"
  android:layout_toLeftOf
="@+id/wbtime" >
  
</ ImageView >
  
< TextView
  
android:id ="@+id/wbtime"
  android:layout_width
="wrap_content"
  android:layout_height
="wrap_content"
  android:layout_alignParentRight
="true"
  android:textColor
="#f7a200"
  android:textSize
="12px" >
  
</ TextView >
  
</ RelativeLayout >
  
< TextView
  
android:id ="@+id/wbtext"
  android:layout_width
="wrap_content"
  android:layout_height
="wrap_content"
  android:textColor
="#424952"
  android:textSize
="13px"
  android:layout_marginTop
="4px" >
  
</ TextView >
  
</ LinearLayout >
</ LinearLayout >  

接下来为列表控件定义一个数据Adapter,代码如下:

weibo9 代码
private  List < WeiBoInfo >  wbList;

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

        
private  AsyncImageLoader asyncImageLoader;
        
        @Override
        
public   int  getCount() {
            
return  wbList.size();
        }

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

        @Override
        
public   long  getItemId( int  position) {
            
return  position;
        }

        @Override
        
public  View getView( int  position, View convertView, ViewGroup parent) {
            asyncImageLoader 
=   new  AsyncImageLoader();
            convertView 
=  LayoutInflater.from(getApplicationContext()).inflate(R.layout.weibo,  null );
            WeiBoHolder wh 
=   new  WeiBoHolder();
            wh.wbicon 
=  (ImageView) convertView.findViewById(R.id.wbicon);
            wh.wbtext 
=  (TextView) convertView.findViewById(R.id.wbtext);
            wh.wbtime 
=  (TextView) convertView.findViewById(R.id.wbtime);
            wh.wbuser 
=  (TextView) convertView.findViewById(R.id.wbuser);
            wh.wbimage
= (ImageView) convertView.findViewById(R.id.wbimage);
            WeiBoInfo wb 
=  wbList.get(position);
            
if (wb != null ){
                convertView.setTag(wb.getId());
                wh.wbuser.setText(wb.getUserName());
                wh.wbtime.setText(wb.getTime());
                wh.wbtext.setText(wb.getText(), TextView.BufferType.SPANNABLE);
                textHighlight(wh.wbtext,
new   char []{ ' # ' }, new   char []{ ' # ' });
                textHighlight(wh.wbtext,
new   char []{ ' @ ' }, new   char []{ ' : ' , '   ' });
                textHighlight2(wh.wbtext,
" http:// " , "   " );
                
                
if (wb.getHaveImage()){
                    wh.wbimage.setImageResource(R.drawable.images);
                }
                Drawable cachedImage 
=  asyncImageLoader.loadDrawable(wb.getUserIcon(),wh.wbicon,  new  ImageCallback(){

                    @Override
                    
public   void  imageLoaded(Drawable imageDrawable,ImageView imageView, String imageUrl) {
                        imageView.setImageDrawable(imageDrawable);
                    }
                    
                });
                 
if  (cachedImage  ==   null ) {
                     wh.wbicon.setImageResource(R.drawable.usericon);
                    }
else {
                        wh.wbicon.setImageDrawable(cachedImage);
                    }
            }
            
            
return  convertView;
        }

     上面的这个Adapter实现没有什么特别的很普通,不过这个中使用了AsyncImageLoader的方法,这个是用来实现用户头像图标的异步载入显示,这样能提高列表显示的速度,提高用户体验,AsyncImageLoader的代码如下:

weibo9 代码
public   class  AsyncImageLoader {
    
// SoftReference是软引用,是为了更好的为了系统回收变量
     private  HashMap < String, SoftReference < Drawable >>  imageCache;
    
public  AsyncImageLoader() {
        imageCache 
=   new  HashMap < String, SoftReference < Drawable >> ();
    }
    
    
public  Drawable loadDrawable( final  String imageUrl, final  ImageView imageView,  final  ImageCallback imageCallback){
        
if  (imageCache.containsKey(imageUrl)) {
            
// 从缓存中获取
            SoftReference < Drawable >  softReference  =  imageCache.get(imageUrl);
            Drawable drawable 
=  softReference.get();
            
if  (drawable  !=   null ) {
                
return  drawable;
            }
        }
        
final  Handler handler  =   new  Handler() {
            
public   void  handleMessage(Message message) {
                imageCallback.imageLoaded((Drawable) message.obj, imageView,imageUrl);
            }
        };
        
// 建立新一个新的线程下载图片
         new  Thread() {
            @Override
            
public   void  run() {
                Drawable drawable 
=  loadImageFromUrl(imageUrl);
                imageCache.put(imageUrl, 
new  SoftReference < Drawable > (drawable));
                Message message 
=  handler.obtainMessage( 0 , drawable);
                handler.sendMessage(message);
            }
        }.start();
        
return   null ;
    }
    
    
public   static  Drawable loadImageFromUrl(String url){
        URL m;
        InputStream i 
=   null ;
        
try  {
            m 
=   new  URL(url);
            i 
=  (InputStream) m.getContent();
        } 
catch  (MalformedURLException e1) {
            e1.printStackTrace();
        } 
catch  (IOException e) {
            e.printStackTrace();
        }
        Drawable d 
=  Drawable.createFromStream(i,  " src " );
        
return  d;
    }
    
    
// 回调接口
     public   interface  ImageCallback {
        
public   void  imageLoaded(Drawable imageDrawable,ImageView imageView, String imageUrl);
    }
}

 

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

weibo9 代码
@Override
    
public   void  onCreate(Bundle savedInstanceState) {
        
super .onCreate(savedInstanceState);
        setContentView(R.layout.home);
        
        。。。。。。
        loadList();
    }

private   void  loadList(){
        
if (ConfigHelper.nowUser == null )
        {
            
        }
        
else
        {
            user
= ConfigHelper.nowUser;
            
// 显示当前用户名称
            TextView showName = (TextView)findViewById(R.id.showName);
            showName.setText(user.getUserName());
            
            OAuth auth
= new  OAuth();
            String url 
=   " http://api.t.sina.com.cn/statuses/friends_timeline.json " ;
            List params
= new  ArrayList();
            params.add(
new  BasicNameValuePair( " source " , auth.consumerKey)); 
            HttpResponse response 
= auth.SignRequest(user.getToken(), user.getTokenSecret(), url, params);
            
if  ( 200   ==  response.getStatusLine().getStatusCode()){
                
try  {
                    InputStream is 
=  response.getEntity().getContent();
                    Reader reader 
=   new  BufferedReader( new  InputStreamReader(is),  4000 );
                    StringBuilder buffer 
=   new  StringBuilder(( int ) response.getEntity().getContentLength());
                    
try  {
                        
char [] tmp  =   new   char [ 1024 ];
                        
int  l;
                        
while  ((l  =  reader.read(tmp))  !=   - 1 ) {
                            buffer.append(tmp, 
0 , l);
                        }
                    } 
finally  {
                        reader.close();
                    }
                    String string 
=  buffer.toString();
                    
// Log.e("json", "rs:" + string);
                    response.getEntity().consumeContent();
                    JSONArray data
= new  JSONArray(string);
                    
for ( int  i = 0 ;i < data.length();i ++ )
                    {
                        JSONObject d
= data.getJSONObject(i);
                        
// Log.e("json", "rs:" + d.getString("created_at"));
                         if (d != null ){
                            JSONObject u
= d.getJSONObject( " user " );
                            
if (d.has( " retweeted_status " )){
                                JSONObject r
= d.getJSONObject( " retweeted_status " );
                            }
                            
                            
// 微博id
                            String id = d.getString( " id " );
                            String userId
= u.getString( " id " );
                            String userName
= u.getString( " screen_name " );
                            String userIcon
= u.getString( " profile_image_url " );
                            Log.e(
" userIcon " , userIcon);
                            String time
= d.getString( " created_at " );
                            String text
= d.getString( " text " );
                            Boolean haveImg
= false ;
                            
if (d.has( " thumbnail_pic " )){
                                haveImg
= true ;
                                
// String thumbnail_pic=d.getString("thumbnail_pic");
                                
// Log.e("thumbnail_pic", thumbnail_pic);
                            }
                            
                            Date date
= new  Date(time);
                            time
= ConvertTime(date);
                            
if (wbList == null ){
                                wbList
= new  ArrayList < WeiBoInfo > ();
                            }
                            WeiBoInfo w
= new  WeiBoInfo();
                            w.setId(id);
                            w.setUserId(userId);
                            w.setUserName(userName);
                            w.setTime(time);
                            w.setText(text);
                            
                            w.setHaveImage(haveImg);
                            w.setUserIcon(userIcon);
                            wbList.add(w);
                        }
                    }
                    
                }
catch  (IllegalStateException e) {
                    e.printStackTrace();
                } 
catch  (IOException e) {
                    e.printStackTrace();
                } 
catch  (JSONException e) {
                    e.printStackTrace();
                } 
            }
            
            
if (wbList != null )
            {
                WeiBoAdapater adapater 
=   new  WeiBoAdapater();
                ListView Msglist
= (ListView)findViewById(R.id.Msglist);
                Msglist.setOnItemClickListener(
new  OnItemClickListener(){
                    @Override
                    
public   void  onItemClick(AdapterView <?>  arg0, View view, int  arg2,  long  arg3) {
                        Object obj
= view.getTag();
                        
if (obj != null ){
                            String id
= obj.toString();
                            Intent intent 
=   new  Intent(HomeActivity. this ,ViewActivity. class );
                            Bundle b
= new  Bundle();
                            b.putString(
" key " , id);
                            intent.putExtras(b);
                            startActivity(intent);
                        }
                    }
                    
                });
                Msglist.setAdapter(adapater);
            }
        }
        loadingLayout.setVisibility(View.GONE);
    }

 

     上面的loadList() 方法通过新浪Api接口http://api.t.sina.com.cn/statuses/friends_timeline.json获取当前登录用户及其所关注用户的最新微博消息,然后显示到列表中。

       这样就完成了用户首页功能的开发

你可能感兴趣的:(weibo)