新浪微博客户端开发--显示单条微博
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这个类里面已经把评论、转发还有收藏的方法定义好的,直接调用它们就可以完成相应的业务。
显示单条微博涉及到图片处理,我会用专门一篇博客介绍,请大家继续关注吧。