新浪微博客户端开发之adapter
2013年11月23日 新浪微博客户端系列博客记录
之前获取首页微博列表还没有介绍adapter,关于adapter可以分出来一块来讲,用过ListView的童鞋们肯定对adapter不会陌生,下面是Android提供的一些Adapter,适用与一些简单的数据填充。
- BaseAdapter是一个抽象类,继承它需要实现较多的方法,所以也就具有较高的灵活性;
- ArrayAdapter支持泛型操作,最为简单,只能展示一行字。
- SimpleAdapter有最好的扩充性,可以自定义出各种效果。
- SimpleCursorAdapter可以适用于简单的纯文字型ListView,它需要Cursor的字段和UI的id对应起来。如需要实现更复杂的UI也可以重写其他方法。可以认为是SimpleAdapter对数据库的简单结合,可以方便地把数据库的内容以列表的形式展示出来。
到了新浪微博这里就需要自定义Adapter了,使用Android提供的adapter已经不能满足需求了,目前小巫所开发的有以下自定义adapter:
AppsListAdaper:用于显示联想搜索得到的app列表。
CommentListAdapter:用于显示评论列表。
FaceListAdapter:用于显示表情列表。
MSGAdapter:用于显示消息页面列表。
UsersListAdaper:用于显示联想搜索得到的User列表。
WeiboListAdapter:用于显示微博列表(首页、收藏、@我的)。
WeiboListNoMoreAdapter:在WeboListAdapter基础上去掉“更多”的adapter。
首页界面效果:
今天我只介绍WeiboListAdapter
/xiaowu_twitter/src/com/wwj/sina/weibo/adapters/WeiboListAdapter.java
WeiboListAdapter是稍显复杂的,因为它要显示的数据比较多,涉及到微博图片的显示,转发内容的显示,先来看看代码先吧。
- packagecom.wwj.sina.weibo.adapters;
- importjava.io.File;
- importjava.util.ArrayList;
- importjava.util.Date;
- importjava.util.List;
- importandroid.app.Activity;
- importandroid.content.Context;
- importandroid.net.Uri;
- importandroid.text.Html;
- importandroid.view.LayoutInflater;
- importandroid.view.View;
- importandroid.view.ViewGroup;
- importandroid.widget.BaseAdapter;
- importandroid.widget.ImageView;
- importandroid.widget.LinearLayout;
- importandroid.widget.TextView;
- importcom.wwj.sina.weibo.R;
- importcom.wwj.sina.weibo.interfaces.Const;
- importcom.wwj.sina.weibo.library.StorageManager;
- importcom.wwj.sina.weibo.library.WeiboManager;
- importcom.wwj.sina.weibo.object.Status;
- importcom.wwj.sina.weibo.util.Tools;
- importcom.wwj.sina.weibo.workqueue.DoneAndProcess;
- importcom.wwj.sina.weibo.workqueue.task.ParentTask;
- /**
- *微博列表适配器主要用来显示首页、提示我的、收藏微博列表
- *
- *@authorwwj
- *
- */
- publicclassWeiboListAdapterextendsBaseAdapterimplementsConst,
- DoneAndProcess{
- protectedActivityactivity;
- protectedinttype;
- protectedLayoutInflaterlayoutInflater;
- protectedList<Status>statuses;
- publicWeiboListAdapter(Activityactivity){
- this.activity=activity;
- }
- /**
- *需要传入一个已经封装微博数据的List对象type表示
- *
- *@paramactivity
- *@paramstatuses
- *@paramtype
- *表示处理的微博数据类型,在Const中定义相关常量
- */
- publicWeiboListAdapter(Activityactivity,List<Status>statuses,inttype){
- this.activity=activity;
- this.type=type;
- layoutInflater=(LayoutInflater)activity
- .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- this.statuses=newArrayList<Status>();
- if(statuses!=null)
- this.statuses.addAll(statuses);
- try{
- //保存微博数据
- StorageManager.saveList(statuses,PATH_STORAGE,type);
- }catch(Exceptione){
- e.printStackTrace();
- }
- }
- @Override
- publicintgetCount(){
- //获取微博数,加1为了最后一项显示"更多"
- returnstatuses.size()+1;
- }
- @Override
- publicObjectgetItem(intposition){
- returnnull;
- }
- @Override
- publiclonggetItemId(intposition){
- return0;
- }
- //获取制定位置的Status对象
- publicStatusgetStatus(intposition){
- if(statuses.size()>0){
- returnstatuses.get(position);
- }else{
- returnnull;
- }
- }
- //获取已经显示的微博的最小ID
- publiclonggetMinId(){
- if(statuses.size()>0)
- returnstatuses.get(statuses.size()-1).id;
- else
- returnLong.MAX_VALUE;
- }
- //获取已经显示的微博最大ID
- publiclonggetMaxId(){
- if(statuses.size()>0)
- returnstatuses.get(0).id;
- else
- return0;
- }
- //添加新的微博
- //在刷新、显示更多微博时会根据不同的情况决定如何添加微博
- publicvoidputStatuses(List<Status>statuses){
- if(statuses==null||this.statuses==null)
- return;
- if(statuses.size()==0)
- return;
- if(this.statuses.size()==0){
- this.statuses.addAll(statuses);
- }elseif(statuses
- .get(0)
- .getCreatedAt()
- .before(this.statuses.get(this.statuses.size()-1)
- .getCreatedAt())){
- this.statuses.addAll(statuses);
- //添加的statuses比原来的新,并且数量小于等于默认返回数量,直接将statuses添加到前面
- }elseif(statuses.get(statuses.size()-1).getCreatedAt()
- .after(this.statuses.get(0).getCreatedAt())
- &&statuses.size()<=DEFAULT_STATUS_COUNT){
- this.statuses.addAll(0,statuses);
- }else{
- this.statuses.clear();
- this.statuses.addAll(statuses);
- }
- try{
- //保存微博信息
- StorageManager.saveList(this.statuses,PATH_STORAGE,type);
- }catch(Exceptione){
- e.printStackTrace();
- }
- //并且刷新ListView
- this.notifyDataSetChanged();
- }
- //控制View行为的
- privatebooleanshowMoreAnimFlag=false;
- protectedbooleanshowRefreshAnimFlag=false;
- publicvoidshowMoreAnim(){
- showMoreAnimFlag=true;
- notifyDataSetChanged();
- }
- publicvoidhideMoreAnim(){
- showMoreAnimFlag=false;
- notifyDataSetChanged();
- }
- publicvoidshowRefreshAnim(){
- showMoreAnimFlag=true;
- notifyDataSetChanged();
- }
- publicvoidhideRefreshAnim(){
- showRefreshAnimFlag=false;
- notifyDataSetChanged();
- }
- //通过url装载要显示的图像,如果图像文件不存在,回通过hideView标志决定是否隐藏ImageView组件
- //hideView:true隐藏ImageViewhideView:false不做任何动作
- privatevoidloadImage(ImageViewimageView,Stringurl,booleanhideView){
- if(url!=null){
- StringimageUrl=WeiboManager.getImageurl(activity,url);
- if(imageUrl!=null){
- imageView.setImageURI(Uri.fromFile(newFile(imageUrl)));
- imageView.setVisibility(View.VISIBLE);
- return;
- }
- }
- if(hideView)
- imageView.setVisibility(View.GONE);
- }
- @Override
- publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
- if(convertView==null){
- convertView=layoutInflater
- .inflate(R.layout.weibo_list_item,null);
- }
- ViewweiboListItem=convertView.findViewById(R.id.ll_weibo_list_item);//微博列表项
- ViewmoreWeiboListItem=convertView
- .findViewById(R.id.rl_more_weibo_list_item);//“更多”列表项
- ViewrefreshWeiboListItem=convertView
- .findViewById(R.id.rl_refresh_weibo_list_item);//"刷新"列表项
- refreshWeiboListItem.setVisibility(View.GONE);
- //当列表项不是最后一项时继续执行
- if(position<statuses.size()){
- weiboListItem.setVisibility(View.VISIBLE);
- moreWeiboListItem.setVisibility(View.GONE);//“更多”不显示
- Statusstatus=statuses.get(position);
- TextViewstatusText=(TextView)convertView
- .findViewById(R.id.tv_text);
- TextViewname=(TextView)convertView.findViewById(R.id.tv_name);
- TextViewcreateAt=(TextView)convertView
- .findViewById(R.id.tv_created_at);
- ImageViewprofileImage=(ImageView)convertView
- .findViewById(R.id.iv_profile_image);
- profileImage.setImageResource(R.drawable.portrait);//设置默认头像
- ImageViewpicture=(ImageView)convertView
- .findViewById(R.id.iv_picture);
- ImageViewstatusImage=(ImageView)convertView
- .findViewById(R.id.iv_status_image);
- ImageViewverified=(ImageView)convertView
- .findViewById(R.id.iv_verified);
- verified.setVisibility(View.GONE);//设置认证不可见
- if(status.user!=null){
- //设置用户认证图标,即各种颜色的“V”或其他符号
- Tools.userVerified(verified,status.user.verified_type);
- }
- statusImage.setImageBitmap(null);
- LinearLayoutinsideContent=(LinearLayout)convertView
- .findViewById(R.id.ll_inside_content);
- ImageViewretweetdetailImage=(ImageView)convertView
- .findViewById(R.id.iv_retweetdetail_image);
- retweetdetailImage.setImageBitmap(null);
- TextViewretweetdetailText=(TextView)convertView
- .findViewById(R.id.tv_retweetdetail_text);
- TextViewsource=(TextView)convertView
- .findViewById(R.id.tv_source);
- //装载图像
- if(status.user!=null){
- loadImage(profileImage,status.user.profile_image_url,false);
- }
- loadImage(statusImage,status.thumbnail_pic,true);
- statusText.setText(Tools.changeTextToFace(activity,
- Html.fromHtml(Tools.atBlue(status.text))));
- if(status.user!=null)
- name.setText(status.user.name);//显示用户昵称
- //当前微博有图像
- if(WeiboManager.hasPicture(status))
- picture.setVisibility(View.VISIBLE);
- else
- picture.setVisibility(View.INVISIBLE);
- createAt.setText(Tools.getTimeStr(status.getCreatedAt(),newDate()));
- source.setText("来自:"+status.getTextSource());//设置微博来源
- if(status.retweeted_status!=null//如果转发的数据不为空
- &&status.retweeted_status.user!=null){
- insideContent.setVisibility(View.VISIBLE);
- retweetdetailText.setText(Html.fromHtml(Tools.atBlue("@"
- +status.retweeted_status.user.name+":"
- +status.retweeted_status.text)));
- loadImage(retweetdetailImage,
- status.retweeted_status.thumbnail_pic,false);
- }else{
- insideContent.setVisibility(View.GONE);
- }
- }else{
- weiboListItem.setVisibility(View.GONE);
- moreWeiboListItem.setVisibility(View.VISIBLE);//显示“更多”
- ViewmoreAnim=convertView.findViewById(R.id.pb_more);
- if(showMoreAnimFlag){
- moreAnim.setVisibility(View.VISIBLE);
- }else{
- moreAnim.setVisibility(View.GONE);
- }
- }
- returnconvertView;
- }
- @Override
- publicvoiddoneProcess(ParentTasktask){
- notifyDataSetChanged();//通知更新列表数据
- }
- }
关于adapter我们需要关注getView这个方法,因为我们要显示的内容都在这里完成,由于每一条的微博数据比较多,所以童鞋们要注意每一项内容显示到哪个控件上。显示的数据是通过构造方法传进来的,每一条微博数据就是一个Status对象,所以我们需要定义相应的实体类,这个类我们怎么知道怎么定义,这就要知道请求API所返回的内容,
比如:https://api.weibo.com/2/statuses/home_timeline.json。我们请求这个API的时候,返回的字段就是我们需要定义的,如果不太清楚,既要好好看看一下开放平台给我们说明。
可以到这里查看:http://open.weibo.com/wiki/2/statuses/home_timeline。
那里很清楚说明了,请求方式,请求参数还有返回的json数据结构。
返回字段说明
返回值字段 | 字段类型 | 字段说明 |
---|---|---|
created_at | string | 微博创建时间 |
id | int64 | 微博ID |
mid | int64 | 微博MID |
idstr | string | 字符串型的微博ID |
text | string | 微博信息内容 |
source | string | 微博来源 |
favorited | boolean | 是否已收藏,true:是,false:否 |
truncated | boolean | 是否被截断,true:是,false:否 |
in_reply_to_status_id | string | (暂未支持)回复ID |
in_reply_to_user_id | string | (暂未支持)回复人UID |
in_reply_to_screen_name | string | (暂未支持)回复人昵称 |
thumbnail_pic | string | 缩略图片地址,没有时不返回此字段 |
bmiddle_pic | string | 中等尺寸图片地址,没有时不返回此字段 |
original_pic | string | 原始图片地址,没有时不返回此字段 |
geo | object | 地理信息字段详细 |
user | object | 微博作者的用户信息字段详细 |
retweeted_status | object | 被转发的原微博信息字段,当该微博为转发微博时返回详细 |
reposts_count | int | 转发数 |
comments_count | int | 评论数 |
attitudes_count | int | 表态数 |
mlevel | int | 暂未支持 |
visible | object | 微博的可见性及指定可见分组信息。该object中type取值,0:普通微博,1:私密微博,3:指定分组微博,4:密友微博;list_id为分组的组号 |
pic_urls | object | 微博配图地址。多图时返回多图链接。无配图返回“[]” |
ad | object array | 微博流内的推广微博ID |
- packagecom.wwj.sina.weibo.object;
- importjava.io.Serializable;
- importjava.util.Date;
- importcom.wwj.sina.weibo.interfaces.WeiboObject;
- importcom.wwj.sina.weibo.util.Tools;
- importandroid.text.Html;
- /**
- *微博实体类
- *@authorwwj
- *
- */
- @SuppressWarnings("serial")
- publicclassStatusimplementsWeiboObject,Serializable{
- /**字符串型的微博ID*/
- publicStringidstr;
- /**创建时间*/
- publicStringcreated_at;
- /**微博ID*/
- publiclongid;
- /**微博信息内容*/
- publicStringtext;
- /**微博来源(html形式)*/
- publicStringsource;
- /**是否已收藏*/
- publicbooleanfavorited;
- /**是否被截断*/
- publicbooleantruncated;
- /**回复ID*/
- publiclongin_reply_to_status_id;
- /**回复人UID*/
- publiclongin_reply_to_user_id;
- /**回复人昵称*/
- publicStringin_reply_to_screen_name;
- /**微博MID*/
- publiclongmid;
- /**中等尺寸图片地址*/
- publicStringbmiddle_pic;
- /**原始图片地址*/
- publicStringoriginal_pic;
- /**缩略图片地址*/
- publicStringthumbnail_pic;
- /**转发数*/
- publicintreposts_count;
- /**评论数*/
- publicintcomments_count;
- /**转发的微博内容*/
- publicStatusretweeted_status;
- /**微博作者的用户信息字段*/
- publicUseruser;//不要初始化,否则可能会引起递归创建对象,导致stack溢出
- /**获取Date形式的创建时间*/
- publicDategetCreatedAt(){
- returnTools.strToDate(created_at);
- }
- /**文本形式的source,*/
- privateStringtext_source;
- /**获取文本形式的source*/
- publicStringgetTextSource(){
- if(text_source==null){
- try{
- //有时返回的来源是null,可能是一个bug,所以必须加上try...catch...
- text_source=Html.fromHtml(source).toString();
- }catch(Exceptione){
- text_source=source;
- }
- }
- returntext_source;
- }
- }
我们在授权第三方应用程序访问用户的数据成功后,就会异步获取用户首页微博数据,然后显示到界面上。
- packagecom.wwj.sina.weibo.listener;
- importjava.io.IOException;
- importjava.util.List;
- importandroid.app.Activity;
- importandroid.os.Bundle;
- importandroid.os.Message;
- importandroid.view.View;
- importandroid.widget.LinearLayout;
- importandroid.widget.Toast;
- importcom.weibo.net.DialogError;
- importcom.weibo.net.WeiboDialogListener;
- importcom.weibo.net.WeiboException;
- importcom.weibo.net.AsyncWeiboRunner.RequestListener;
- importcom.wwj.sina.weibo.Home;
- importcom.wwj.sina.weibo.R;
- importcom.wwj.sina.weibo.adapters.WeiboListAdapter;
- importcom.wwj.sina.weibo.interfaces.Const;
- importcom.wwj.sina.weibo.library.JSONAndObject;
- importcom.wwj.sina.weibo.library.StorageManager;
- importcom.wwj.sina.weibo.library.WeiboManager;
- importcom.wwj.sina.weibo.listener.impl.StatusRequestListenerImpl;
- importcom.wwj.sina.weibo.object.Status;
- importcom.wwj.sina.weibo.object.User;
- importcom.wwj.sina.weibo.util.LogUtils;
- importcom.wwj.sina.weibo.util.SettingUtil;
- importcom.wwj.sina.weibo.util.Tools;
- publicclassAuthDialogListenerimplementsWeiboDialogListener,Const{
- privateActivityactivity;
- publicAuthDialogListener(Activityactivity){
- super();
- this.activity=activity;
- }
- //认证成功后调用
- publicvoidonComplete(Bundlevalues){
- //保存access_token和expires_in
- Stringtoken=values.getString("access_token");
- Stringexpires_in=values.getString("expires_in");
- SettingUtil.set(activity,SettingUtil.ACCESS_TOKEN,token);
- SettingUtil.set(activity,SettingUtil.EXPIRES_IN,expires_in);
- Toast.makeText(activity,"认证成功",Toast.LENGTH_SHORT).show();
- finalHomehomeActivity=(Home)activity;
- WeiboListAdapterweiboListAdapter=null;
- //得到用户的唯一标识
- longuid=Long.parseLong(values.getString("uid"));
- //保存用户UID
- StorageManager.setValue(activity,"uid",uid);
- WeiboManager.getUserAsync(homeActivity,
- StorageManager.getValue(homeActivity,"uid",0),
- newRequestListener(){
- @Override
- publicvoidonIOException(IOExceptione){
- }
- @Override
- publicvoidonError(WeiboExceptione){
- }
- @Override
- publicvoidonComplete(Stringresponse){
- Useruser=newUser();
- JSONAndObject.convertSingleObject((Object)user,
- response);
- Messagemsg=newMessage();
- msg.obj=user;
- homeActivity.handler.sendMessage(msg);
- }
- });
- ViewhomeReloadAnim=homeActivity.findViewById(R.id.pb_home_reload);
- ViewhomeReload=homeActivity.findViewById(R.id.btn_home_reload);
- homeReloadAnim.setVisibility(View.VISIBLE);
- homeReload.setVisibility(View.GONE);
- LinearLayoutll_home_layout=(LinearLayout)homeActivity
- .findViewById(R.id.ll_home_layout);
- List<Status>statuses=WeiboManager.getHomeTimelineAsync(homeActivity,
- newStatusRequestListenerImpl(homeActivity,ll_home_layout,
- HOME));
- weiboListAdapter=newWeiboListAdapter(activity,statuses,Const.HOME);
- homeActivity.homeTimelineAdapter=weiboListAdapter;
- homeActivity.imageWorkQueueMonitor=Tools
- .getGlobalObject(homeActivity).getImageWorkQueueMonitor(
- homeActivity);
- homeActivity.taskWorkQueueMonitor=Tools.getGlobalObject(homeActivity)
- .getTaskWorkQueueMonitor(activity);
- homeActivity.imageWorkQueueMonitor.addDoneAndProcess(Const.HOME,
- weiboListAdapter);
- }
- publicvoidonWeiboException(WeiboExceptione){
- LogUtils.e("###onWeiboException");
- //当认证过程中捕获到WeiboException时调用
- Toast.makeText(activity,"Authexception:"+e.getMessage(),
- Toast.LENGTH_LONG).show();
- activity.finish();
- }
- publicvoidonError(DialogErrore){
- LogUtils.e("###onError");
- //Oauth2.0认证过程中,当认证对话框中的webView接收数据出现错误时调用此方法
- Toast.makeText(activity,"Autherror:"+e.getMessage(),
- Toast.LENGTH_LONG).show();
- activity.finish();
- }
- publicvoidonCancel(){
- LogUtils.e("###onCancel");
- //Oauth2.0认证过程中,如果认证窗口被关闭或认证取消时调用
- Toast.makeText(activity,"Authcancel",Toast.LENGTH_LONG).show();
- activity.finish();
- }
- }
statuses的数据是由WeiboManager类当中getHomeTimelineAsync返回来的,这方法传入了一个监听器,StatusRequestListenerImpl这里类实现AsyncWeiboRunner类的RequestListener接口。
- LinearLayoutll_home_layout=(LinearLayout)homeActivity
- .findViewById(R.id.ll_home_layout);
- List<Status>statuses=WeiboManager.getHomeTimelineAsync(homeActivity,
- newStatusRequestListenerImpl(homeActivity,ll_home_layout,
- HOME));
- weiboListAdapter=newWeiboListAdapter(activity,statuses,Const.HOME);
- homeActivity.homeTimelineAdapter=weiboListAdapter;
- homeActivity.imageWorkQueueMonitor=Tools
- .getGlobalObject(homeActivity).getImageWorkQueueMonitor(
- homeActivity);
- homeActivity.taskWorkQueueMonitor=Tools.getGlobalObject(homeActivity)
- .getTaskWorkQueueMonitor(activity);
- homeActivity.imageWorkQueueMonitor.addDoneAndProcess(Const.HOME,
- weiboListAdapter);
AsyncWeiboRunner这个就是实现异步请求数据的类,通过构造函数传入进来的listener,调用它的onComplete方法就可以把请求的数据得到。
- /*
- *Copyright2011Sina.
- *
- *LicensedundertheApacheLicenseandWeiboLicense,Version2.0(the"License");
- *youmaynotusethisfileexceptincompliancewiththeLicense.
- *YoumayobtainacopyoftheLicenseat
- *
- *http://www.open.weibo.com
- *http://www.apache.org/licenses/LICENSE-2.0
- *
- *Unlessrequiredbyapplicablelaworagreedtoinwriting,software
- *distributedundertheLicenseisdistributedonan"ASIS"BASIS,
- *WITHOUTWARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied.
- *SeetheLicenseforthespecificlanguagegoverningpermissionsand
- *limitationsundertheLicense.
- */
- packagecom.weibo.net;
- importjava.io.IOException;
- importcom.wwj.sina.weibo.util.LogUtils;
- importandroid.content.Context;
- /**
- *EncapsulationmainWeiboAPIs,Include:1.getRquestToken,2.
- *getAccessToken,3.urlrequest.Implementsaweiboapiasaasynchronized
- *way.Everyobjectusedthisrunnershouldimplementinterface
- *RequestListener.
- *异步请求数据的类
- *@authorZhangJie([email protected])
- */
- publicclassAsyncWeiboRunner{
- privateWeibomWeibo;
- publicAsyncWeiboRunner(Weiboweibo){
- this.mWeibo=weibo;
- }
- publicvoidrequest(finalContextcontext,finalStringurl,
- finalWeiboParametersparams,finalStringhttpMethod,
- finalRequestListenerlistener){
- LogUtils.d("###AsyncWeiboRunnerrequest");
- newThread(){
- @Override
- publicvoidrun(){
- try{
- Stringresp=mWeibo.request(context,url,params,
- httpMethod,mWeibo.getAccessToken());
- listener.onComplete(resp);
- }catch(WeiboExceptione){
- listener.onError(e);
- }
- }
- }.start();
- }
- //请求接口
- publicstaticinterfaceRequestListener{
- publicvoidonComplete(Stringresponse);
- publicvoidonIOException(IOExceptione);
- publicvoidonError(WeiboExceptione);
- }
- }
- packagecom.wwj.sina.weibo.listener.impl;
- importjava.io.IOException;
- importjava.text.SimpleDateFormat;
- importjava.util.Date;
- importjava.util.List;
- importandroid.app.Activity;
- importandroid.os.Handler;
- importandroid.os.Message;
- importandroid.view.View;
- importcom.weibo.net.AsyncWeiboRunner.RequestListener;
- importcom.weibo.net.WeiboException;
- importcom.wwj.sina.weibo.Home;
- importcom.wwj.sina.weibo.MessageViewer;
- importcom.wwj.sina.weibo.R;
- importcom.wwj.sina.weibo.adapters.WeiboListAdapter;
- importcom.wwj.sina.weibo.adapters.WeiboListNoMoreAdapter;
- importcom.wwj.sina.weibo.interfaces.Const;
- importcom.wwj.sina.weibo.library.JSONAndObject;
- importcom.wwj.sina.weibo.library.WeiboManager;
- importcom.wwj.sina.weibo.object.Favorite;
- importcom.wwj.sina.weibo.object.Status;
- importcom.wwj.sina.weibo.util.LogUtils;
- /**
- *微博数据请求监听器实现
- *@authorwwj
- *
- */
- publicclassStatusRequestListenerImplimplementsRequestListener,Const{
- privateWeiboListAdapterweiboListAdapter;
- privateWeiboListNoMoreAdapterweiboListNoMoreAdapter;//隐藏“更多”
- privateActivityactivity;
- privateViewparent;
- privateinttype;
- privateHomehomeActivity;
- privateMessageViewermessageViewer;
- privateHandlerhandler=newHandler(){
- publicvoidhandleMessage(android.os.Messagemsg){
- SimpleDateFormatformat=newSimpleDateFormat("yyyy年MM月dd日HH:mm");
- Stringdate=format.format(newDate());
- switch(type){
- caseHOME:
- weiboListAdapter.putStatuses((List<Status>)msg.obj);
- weiboListAdapter.hideMoreAnim();
- weiboListAdapter.hideRefreshAnim();
- homeActivity=(Home)activity;
- if(homeActivity.weiboListView.getAdapter()==null){
- homeActivity.weiboListView.setAdapter(weiboListAdapter);
- homeActivity.imageWorkQueueMonitor.addDoneAndProcess(HOME,
- weiboListAdapter);
- }
- ViewhomeReloadAnim=parent.findViewById(R.id.pb_home_reload);
- ViewhomeReload=parent.findViewById(R.id.btn_home_reload);
- homeReloadAnim.setVisibility(View.GONE);
- homeReload.setVisibility(View.VISIBLE);
- homeActivity.weiboListView.onRefreshComplete(date);
- break;
- caseMESSAGE_AT:
- caseUSER_TIMELINE:
- weiboListAdapter.putStatuses((List<Status>)msg.obj);
- weiboListAdapter.hideMoreAnim();
- weiboListAdapter.hideRefreshAnim();
- messageViewer=(MessageViewer)activity;
- if(messageViewer.messageListView.getAdapter()==null){
- messageViewer.messageListView.setAdapter(weiboListAdapter);
- messageViewer.imageWorkQueueMonitor.addDoneAndProcess(type,
- weiboListAdapter);
- }
- ViewmessageReloadAnim=parent
- .findViewById(R.id.pb_message_reload);
- ViewmessageReload=parent
- .findViewById(R.id.btn_message_reload);
- messageReloadAnim.setVisibility(View.GONE);
- messageReload.setVisibility(View.VISIBLE);
- messageViewer.messageListView.onRefreshComplete(date);
- break;
- caseMESSAGE_FAVORITE:
- weiboListNoMoreAdapter.putStatuses((List<Status>)msg.obj);
- messageViewer=(MessageViewer)activity;
- if(messageViewer.messageListView.getAdapter()==null){
- messageViewer.messageListView
- .setAdapter(weiboListNoMoreAdapter);
- messageViewer.imageWorkQueueMonitor.addDoneAndProcess(
- MESSAGE_FAVORITE,weiboListNoMoreAdapter);
- }
- ViewmessageReloadAnim2=parent
- .findViewById(R.id.pb_message_reload);
- ViewmessageReload2=parent
- .findViewById(R.id.btn_message_reload);
- messageReloadAnim2.setVisibility(View.GONE);
- messageReload2.setVisibility(View.VISIBLE);
- messageViewer.messageListView.onRefreshComplete(date);
- break;
- default:
- break;
- }
- super.handleMessage(msg);
- };
- };
- publicStatusRequestListenerImpl(Activityactivity,Viewparent,inttype){
- this.activity=activity;
- this.parent=parent;
- this.type=type;
- }
- @Override
- publicvoidonComplete(Stringresponse){
- @SuppressWarnings("unchecked")
- List<Status>statuses=JSONAndObject.convert(Status.class,response,
- "statuses");
- switch(type){
- caseHOME:
- LogUtils.d("###home");
- homeActivity=(Home)activity;
- if(homeActivity.homeTimelineAdapter!=null){
- weiboListAdapter=homeActivity.homeTimelineAdapter;
- }else{
- weiboListAdapter=newWeiboListAdapter(homeActivity,null,
- type);
- homeActivity.homeTimelineAdapter=weiboListAdapter;
- }
- break;
- caseMESSAGE_AT:
- caseUSER_TIMELINE:
- LogUtils.d("###MESSAGE_AT");
- messageViewer=(MessageViewer)activity;
- if(messageViewer.messageListAdapter!=null){
- weiboListAdapter=messageViewer.messageListAdapter;
- }else{
- weiboListAdapter=newWeiboListAdapter(messageViewer,null,
- type);
- messageViewer.messageListAdapter=weiboListAdapter;
- }
- break;
- caseMESSAGE_FAVORITE:
- LogUtils.d("###MESSAGE_FAVORITE");
- messageViewer=(MessageViewer)activity;
- if(messageViewer.weiboListNoMoreAdapter!=null){
- weiboListNoMoreAdapter=messageViewer.weiboListNoMoreAdapter;
- }else{
- weiboListNoMoreAdapter=newWeiboListNoMoreAdapter(
- messageViewer,null,MESSAGE_FAVORITE);
- messageViewer.messageListAdapter=weiboListNoMoreAdapter;
- }
- List<Favorite>favorites=null;
- favorites=JSONAndObject.convert(Favorite.class,response,
- "favorites");
- statuses=WeiboManager.FavoriteToStatus(favorites);
- default:
- break;
- }
- Messagemsg=newMessage();
- msg.obj=statuses;
- handler.sendMessage(msg);
- }
- @Override
- publicvoidonIOException(IOExceptione){
- e.printStackTrace();
- }
- @Override
- publicvoidonError(WeiboExceptione){
- e.printStackTrace();
- }
- }
这篇博客的关键点应该不在adapter这里,如何异步更新UI才是最重要的,我这里使用的是handler来更新UI。线程的异步操作就主要通过AsyncWeiboRunner这个类实现,这部分内容就已经囊括了其他微博数据的获取实现流程,获取收藏列表和提到我的微博列表都是类似的实现,我就不多介绍了