新浪微博客户端开发--显示单条微博

来源:互联网 发布:淘宝上靠谱的翡翠店 编辑:程序博客网 时间:2024/06/12 20:12
新浪微博客户端开发--显示单条微博


2013年11月23日新浪微博客户端开发记录


前面两篇博客介绍了如何调用新浪微博API发布微博,任务队列的实现流程,自定义微博adapter的实现,异步更新UI的实现。这基本上已经是这个新浪微博客户端所涉及到比较重要的内容,我们要明确一点,我们客户端最终目的是要得到微博数据,然后显示到界面上来;所以我们要知道数据从哪来,是怎么得到的,然后我们通过什么方式把它显示出来。其实我们有部分内容我们不需要自己去实现,这部分内容是在com.wei.net这个包下,这个包涉及到http协议层的内容,比较复杂,这部分内容我们只需要了解怎么使用他们就行了,其实我们用到的比较重要的类有:

Weibo、AsyncWeiboRunner、Utility。这是我们进行网络请求数据的时候需要用到的,童鞋们最好认真去看一下。



本篇博客要介绍的显示单条微博,先看看效果图,然后再细说。

用过官方新浪微博客户端的人都知道,单击单条微博,会跳入另外一个界面显示微博详情,会把图片加载出来,点击图片可以放大查看,还可以对图片进行保存。


在Home.java里有单击微博列表的触发方法

@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position,long id) {Intent intent = null;switch (parent.getId()) {case R.id.weibolist:// 按更多项// 注意:更多点击的位置if (position == homeTimelineAdapter.getCount()) {long maxId = homeTimelineAdapter.getMinId() - 1; // 以"更多"的上一项作为最大IdWeiboManager.getHomeTimeline(this, 0, maxId,DEFAULT_STATUS_COUNT, true,new StatusRequestListenerImpl(this, linearLayoutHome,HOME));homeTimelineAdapter.showMoreAnim(); // 显示更多动画} else { // 点击列表项Status status = homeTimelineAdapter.getStatus(position - 1);if (status != null) {intent = new Intent(this, WeiboViewer.class);WeiboViewer.status = status;startActivity(intent);}}break;default:break;}}

只要点击的位置不是最后一条,最后一条是显示“更多”是用来加载以往微博数据的,点击列表想就会跳转到WeiboView这个界面,并且利用Intent把当前Status对象传过去。

我们来看看这个界面:

package com.wwj.sina.weibo;import java.io.File;import java.io.IOException;import android.app.Activity;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.text.Html;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ImageView;import android.widget.ProgressBar;import android.widget.TextView;import android.widget.Toast;import com.weibo.net.AsyncWeiboRunner.RequestListener;import com.weibo.net.WeiboException;import com.wwj.sina.weibo.interfaces.Const;import com.wwj.sina.weibo.library.JSONAndObject;import com.wwj.sina.weibo.library.WeiboManager;import com.wwj.sina.weibo.object.Status;import com.wwj.sina.weibo.util.Tools;import com.wwj.sina.weibo.workqueue.DoneAndProcess;import com.wwj.sina.weibo.workqueue.task.FavoriteWeiboTask;import com.wwj.sina.weibo.workqueue.task.ParentTask;import com.wwj.sina.weibo.workqueue.task.PullFileTask;/** * 浏览单条微博视图 *  * @author wwj *  */public class WeiboViewer extends Activity implements Const, RequestListener,DoneAndProcess, OnClickListener {// 必须声明为static,使用intent传递status就不是原来的status了public static Status status;private ImageView profileImage; // 头像private ImageView verified; // 认证图片private TextView userName; // 用户昵称private TextView statusText; // 微博内容private View insideContent; // 转发内容private TextView retweetdetailText; // 转发文本private ImageView retweetdetailImage; // 转发内容的图片private ImageView statusImage; // 微博图片private TextView source; // 微博来源private Button forwardButton; // 转发按钮private Button retweetdetailForwardButton;private Button commentButton; // 评论按钮private Button retweetdetailCommentButton;private Button refreshButton; // 刷新按钮private ProgressBar refreshProgressBar; // 刷新进度条private View favorite; // 收藏private View unfavorite; // 取消收藏private Handler handler = new Handler() {public void handleMessage(android.os.Message msg) {// 处理文件下载任务if (msg.obj instanceof PullFileTask) {String imageUrl = null;imageUrl = WeiboManager.getImageurl(WeiboViewer.this,status.user.profile_image_url, WeiboViewer.this);if (imageUrl != null) {profileImage.setImageURI(Uri.fromFile(new File(imageUrl)));}if (status.retweeted_status == null) {imageUrl = WeiboManager.getImageurl(WeiboViewer.this,status.bmiddle_pic, WeiboViewer.this);if (imageUrl != null) {statusImage.setImageURI(Uri.fromFile(new File(imageUrl)));}} else {imageUrl = WeiboManager.getImageurl(WeiboViewer.this,status.retweeted_status.bmiddle_pic,WeiboViewer.this);if (imageUrl != null) {retweetdetailImage.setImageURI(Uri.fromFile(new File(imageUrl)));}}}// 处理收藏微博任务else if (msg.obj instanceof FavoriteWeiboTask) {if (favorite.getVisibility() == View.VISIBLE) {favorite.setVisibility(View.GONE);unfavorite.setVisibility(View.VISIBLE);status.favorited = true;Toast.makeText(WeiboViewer.this, "收藏成功", Toast.LENGTH_LONG).show();} else {status.favorited = false;favorite.setVisibility(View.VISIBLE);unfavorite.setVisibility(View.GONE);Toast.makeText(WeiboViewer.this, "取消收藏成功",Toast.LENGTH_LONG).show();}}// 处理刷新else if (msg.obj instanceof Status) // 刷新{refreshButton.setVisibility(View.VISIBLE);refreshProgressBar.setVisibility(View.GONE);loadContent();}super.handleMessage(msg);};};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.weibo_viewer);profileImage = (ImageView) findViewById(R.id.iv_profile_image);verified = (ImageView) findViewById(R.id.imageview_verified);userName = (TextView) findViewById(R.id.tv_name);statusText = (TextView) findViewById(R.id.tv_text);statusImage = (ImageView) findViewById(R.id.iv_status_image);insideContent = findViewById(R.id.ll_inside_content);retweetdetailText = (TextView) findViewById(R.id.tv_retweetdetail_text);retweetdetailImage = (ImageView) findViewById(R.id.iv_retweetdetail_image);source = (TextView) findViewById(R.id.tv_source);forwardButton = (Button) findViewById(R.id.btn_forward);commentButton = (Button) findViewById(R.id.btn_comment);retweetdetailForwardButton = (Button) findViewById(R.id.btn_retweetdetail_forward);retweetdetailCommentButton = (Button) findViewById(R.id.btn_retweetdetail_comment);favorite = findViewById(R.id.ll_fav);unfavorite = findViewById(R.id.ll_unfav);refreshButton = (Button) findViewById(R.id.btn_refresh);refreshProgressBar = (ProgressBar) findViewById(R.id.pb_refresh);findViewById(R.id.ll_forward).setOnClickListener(this);findViewById(R.id.ll_comment).setOnClickListener(this);findViewById(R.id.btn_back).setOnClickListener(this);refreshButton.setOnClickListener(this);retweetdetailImage.setOnClickListener(this);statusImage.setOnClickListener(this);forwardButton.setOnClickListener(this);commentButton.setOnClickListener(this);retweetdetailForwardButton.setOnClickListener(this);retweetdetailCommentButton.setOnClickListener(this);favorite.setOnClickListener(this);unfavorite.setOnClickListener(this);loadContent();}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);}private void loadContent() {// 异步加载头像String imageUrl = WeiboManager.getImageurl(this,status.user.profile_image_url, this);if (imageUrl != null) {profileImage.setImageURI(Uri.fromFile(new File(imageUrl)));}userName.setText(status.user.name);Tools.userVerified(verified, status.user.verified_type);statusText.setText(Tools.changeTextToFace(this,Html.fromHtml(Tools.atBlue(status.text))));source.setText("来自   " + status.getTextSource());if (status.retweeted_status == null) {insideContent.setVisibility(View.GONE);} else {insideContent.setVisibility(View.VISIBLE);retweetdetailText.setText(Html.fromHtml(Tools.atBlue("@"+ status.retweeted_status.user.name + ":"+ status.retweeted_status.text)));retweetdetailForwardButton.setText(String.valueOf(status.retweeted_status.reposts_count));retweetdetailCommentButton.setText(String.valueOf(status.retweeted_status.comments_count));}if (WeiboManager.hasPicture(status)) {if (status.retweeted_status == null) {statusImage.setVisibility(View.VISIBLE);retweetdetailImage.setVisibility(View.GONE);// 异步装载图片imageUrl = WeiboManager.getImageurl(this, status.bmiddle_pic,this);if (imageUrl != null) {statusImage.setImageURI(Uri.fromFile(new File(imageUrl)));}} else {statusImage.setVisibility(View.GONE);retweetdetailImage.setVisibility(View.VISIBLE);// 异步装载图像imageUrl = WeiboManager.getImageurl(this,status.retweeted_status.bmiddle_pic, this);if (imageUrl != null) {retweetdetailImage.setImageURI(Uri.fromFile(new File(imageUrl)));}}}forwardButton.setText(String.valueOf(status.reposts_count));commentButton.setText(String.valueOf(status.comments_count));if (status.favorited) {favorite.setVisibility(View.GONE);unfavorite.setVisibility(View.VISIBLE);} else {favorite.setVisibility(View.VISIBLE);unfavorite.setVisibility(View.GONE);}}@Overridepublic void onClick(View v) {Intent intent = null;switch (v.getId()) {case R.id.iv_status_image:case R.id.iv_retweetdetail_image:String url = status.original_pic;if (status.retweeted_status != null) {url = status.retweeted_status.original_pic;}intent = new Intent(this, PictureViewer.class);intent.putExtra("file_url", url);intent.putExtra("type", PICTURE_VIEWER_WEIBO_BROWSER);startActivity(intent);break;case R.id.btn_forward:case R.id.ll_forward:forward(); // 转发微博break;case R.id.btn_retweetdetail_forward:retweetdetailForword();break;case R.id.ll_comment:comment();break;case R.id.ll_fav:case R.id.ll_unfav:favorite(!status.favorited);break;case R.id.btn_comment:intent = new Intent(this, CommentListViewer.class);intent.putExtra("status_id", status.id);intent.putExtra("text", "//@" + status.user.name + ":"+ status.text);startActivity(intent);break;case R.id.btn_retweetdetail_comment:intent = new Intent(this, CommentListViewer.class);intent.putExtra("status_id", status.retweeted_status.id);intent.putExtra("text", "//@" + status.retweeted_status.user.name+ ":" + status.retweeted_status.text);startActivity(intent);break;case R.id.btn_back:finish();break;case R.id.btn_refresh:refreshButton.setVisibility(View.GONE);refreshProgressBar.setVisibility(View.VISIBLE);WeiboManager.getStatusAsync(this, status.id, this);break;default:break;}}// 收藏微博private void favorite(boolean fav) {FavoriteWeiboTask favoriteWeiboTask = new FavoriteWeiboTask();favoriteWeiboTask.id = status.id;favoriteWeiboTask.fav = fav;favoriteWeiboTask.doneAndProcess = this;Tools.getGlobalObject(this).getWorkQueueStorage().addTask(favoriteWeiboTask);}// 转发微博private void forward() {String text = "//@" + status.user.name + ":" + status.text;Intent intent = new Intent(this, PostWeibo.class);intent.putExtra("type", TYPE_FORWARD);intent.putExtra("title", "转发微博");intent.putExtra("text", text);intent.putExtra("status_id", status.id);startActivity(intent);}// 转发原微博private void retweetdetailForword() {String text = "//@" + status.retweeted_status.user.name + ":"+ status.retweeted_status.text;Intent intent = new Intent(this, PostWeibo.class);intent.putExtra("type", TYPE_FORWARD);intent.putExtra("title", "转发微博");intent.putExtra("text", text);intent.putExtra("status_id", status.retweeted_status.id);startActivity(intent);}private void comment() {Intent intent = new Intent(this, PostWeibo.class);intent.putExtra("type", TYPE_COMMENT);intent.putExtra("title", "评论微博");intent.putExtra("text", "");intent.putExtra("status_id", status.id);startActivity(intent);}@Overridepublic void doneProcess(ParentTask task) {Message msg = new Message();msg.obj = task;handler.sendMessage(msg);}@Overridepublic void onComplete(String response) {// 重新将微博数据装载到status中JSONAndObject.convertSingleObject(status, response);Message msg = new Message();msg.obj = status;// 使用Handler刷新控件中的数据handler.sendMessage(msg);}@Overridepublic void onIOException(IOException e) {}@Overridepublic void onError(WeiboException e) {}}

其实代码并不复杂,我们通过调用loadContent()方法把数据显示出来,这里我们需要注意的是,微博里带的图片是通过异步加载出来的。WeiboView这个类里面已经把评论、转发还有收藏的方法定义好的,直接调用它们就可以完成相应的业务。


显示单条微博涉及到图片处理,我会用专门一篇博客介绍,请大家继续关注吧。



原创粉丝点击