现在的位置: 首页 > 综合 > 正文

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

2014年02月12日 ⁄ 综合 ⁄ 共 10734字 ⁄ 字号 评论关闭
新浪微博客户端开发--显示单条微博

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这个类里面已经把评论、转发还有收藏的方法定义好的,直接调用它们就可以完成相应的业务。


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


抱歉!评论已关闭.