新浪微博客户端开发--显示单条微博
2013年11月23日 新浪微博客户端开发记录
前面两篇博客介绍了如何调用新浪微博API发布微博,任务队列的实现流程,自定义微博adapter的实现,异步更新UI的实现。这基本上已经是这个新浪微博客户端所涉及到比较重要的内容,我们要明确一点,我们客户端最终目的是要得到微博数据,然后显示到界面上来;所以我们要知道数据从哪来,是怎么得到的,然后我们通过什么方式把它显示出来。其实我们有部分内容我们不需要自己去实现,这部分内容是在com.wei.net这个包下,这个包涉及到http协议层的内容,比较复杂,这部分内容我们只需要了解怎么使用他们就行了,其实我们用到的比较重要的类有:
Weibo、AsyncWeiboRunner、Utility。这是我们进行网络请求数据的时候需要用到的,童鞋们最好认真去看一下。
本篇博客要介绍的显示单条微博,先看看效果图,然后再细说。
用过官方新浪微博客户端的人都知道,单击单条微博,会跳入另外一个界面显示微博详情,会把图片加载出来,点击图片可以放大查看,还可以对图片进行保存。
在Home.java里有单击微博列表的触发方法
@Override
public 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; // 以"更多"的上一项作为最大Id
WeiboManager.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);
};
};
@Override
protected 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();
}
@Override
protected 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);
}
}
@Override
public 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);
}
@Override
public void doneProcess(ParentTask task) {
Message msg = new Message();
msg.obj = task;
handler.sendMessage(msg);
}
@Override
public void onComplete(String response) {
// 重新将微博数据装载到status中
JSONAndObject.convertSingleObject(status, response);
Message msg = new Message();
msg.obj = status;
// 使用Handler刷新控件中的数据
handler.sendMessage(msg);
}
@Override
public void onIOException(IOException e) {
}
@Override
public void onError(WeiboException e) {
}
}
其实代码并不复杂,我们通过调用loadContent()方法把数据显示出来,这里我们需要注意的是,微博里带的图片是通过异步加载出来的。WeiboView这个类里面已经把评论、转发还有收藏的方法定义好的,直接调用它们就可以完成相应的业务。
显示单条微博涉及到图片处理,我会用专门一篇博客介绍,请大家继续关注吧。