关闭

新浪微博开发之微博主页的实现

1611人阅读 评论(1) 收藏 举报

用户使用已授权用户登录成功之后,我们就可以获取微博了。微博主页既是用户登录新浪微博时看到的内容,即自己关注用户的微博内容。我们可使用SDK中Weibo的getHomeTimeline()方法,该方法通过对API接口的访问获取微博Json数据。使用该方法前我们一定要为Weibo设置accessToken值

布局中放置一个ListView,我们要做的主要是为listview设置微博数据,布局代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical" android:layout_width="fill_parent"
	android:layout_height="fill_parent" android:background="@color/white">
	<include android:id="@+id/content_progress" layout="@layout/progress_bar" />
	<RelativeLayout android:gravity="right" android:paddingRight="30dip"
		android:layout_width="wrap_content" android:layout_height="wrap_content">
		<ImageView android:layout_width="80dip" android:id="@+id/try_again"
			android:layout_height="80dip" android:layout_marginTop="10dip" 
			android:background="@drawable/try_again"
			android:visibility="gone"
			android:layout_alignParentRight="true">
		</ImageView>
	</RelativeLayout>
	<ImageView android:id="@+id/empty" android:layout_width="wrap_content"
		android:layout_height="wrap_content" android:background="@drawable/empty"
		android:layout_gravity="center"/>
	<ListView android:id="@+id/contentList" android:layout_width="fill_parent"
		android:layout_height="fill_parent" android:visibility="gone"
		android:divider="@drawable/divider_horizontal_timeline" android:listSelector="#00000000"
		android:cacheColorHint="#00000000">
	</ListView>
	
</LinearLayout>

在获取数据时我们要显示一个进度条,当获取到数据后关闭进度条!为了避免ANR我们同样采用启动新线程来获取数据,使用Handler来更新UI。具体代码:

package com.cloay.weibo.ui;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import weibo4android.Status;
import weibo4android.Weibo;

import com.cloay.weibo.R;
import com.cloay.weibo.constants.Constant;
import com.cloay.weibo.constants.OAuthConstant;
import com.cloay.weibo.service.MainService;
import com.cloay.weibo.service.Task;
import com.cloay.weibo.utils.AlertDlgUtil;
import com.cloay.weibo.utils.CheckNetUtil;
import com.cloay.weibo.utils.ToastUtil;
import com.cloay.weibo.adapter.HomeListAdapter;

import android.app.Activity;
import android.app.Service;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.Vibrator;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
/**
 * 微博主页
 * @author Cloay
 * 2012-2-24
 * 下午05:18:13
 */
public class HomeActivity extends Activity implements SensorEventListener{
	private LinearLayout progress;  //进度条
	private ImageView empty;   //数据为获取时
	private ImageView tryAgain;   //刷新重试
	private ListView listView;  //存储微博数据
	private List<Status> listStatus = new ArrayList<Status>();   //存放微博数据的list
	private HomeListAdapter adapter;
	private Weibo mWeibo = OAuthConstant.getInstance().getWeibo();
	//用于摇一摇刷新微博
	SensorManager sensorManager = null;  
    Vibrator vibrator = null; 
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		MainService.allActivity.add(this);
		setContentView(R.layout.home);
		//初识化
		init();
		//加载微博数据
		getStatus();
	}
	
	/**
	 * 后台加载微博数据
	 */
	private void getStatus() {
		if(CheckNetUtil.checkNet(HomeActivity.this)){ //先检查网络是否可用
			HashMap<String, Weibo> parms = new HashMap<String, Weibo>();
			parms.put("weibo", mWeibo);
			Task task = new Task(Task.GET_STATUS, parms);
			MainService.allTask.add(task);
		}else{
			progress.setVisibility(View.GONE);
			tryAgain.setVisibility(View.VISIBLE);
			AlertDlgUtil.alertDialogNetErr(HomeActivity.this);
		}
		
	}

	private void init() {
		mWeibo.setOAuthAccessToken(OAuthConstant.getInstance().getAccessToken());  //一定要设置
		sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);  
        vibrator = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE);
		progress = (LinearLayout) findViewById(R.id.content_progress);  
		empty = (ImageView) findViewById(R.id.empty);
		tryAgain = (ImageView) findViewById(R.id.try_again);
		listView = (ListView) findViewById(R.id.contentList);
		listView.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				if(adapter.listSize == position + 1 && position < 65){      //动态加载跟多微博数据
					adapter.listSize += 15;
					adapter.notifyDataSetChanged();
				}else{
					Bundle bundle = new Bundle();
					Status status = listStatus.get(position);
					bundle.putSerializable("status", status);
					Intent intent = new Intent(HomeActivity.this, StatusDetail.class);  //查看详细微博
					intent.putExtras(bundle);
					startActivity(intent);
				}
			}
		});
	}
	
	private Handler handler = new Handler(){
		@SuppressWarnings("unchecked")
		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			if(msg.what == Constant.GET_DATA_NORMAL){         //if获取数据正常
				listStatus = (List<Status>) msg.obj;  
				adapter = new HomeListAdapter(HomeActivity.this, listStatus);
				listView.setAdapter(adapter);
				progress.setVisibility(View.GONE);     //关闭进度条
				empty.setVisibility(View.GONE);       //获取数据后隐藏
				if(tryAgain.isShown()){
					tryAgain.setVisibility(View.GONE);
				}
				listView.setVisibility(View.VISIBLE);
			}else if(msg.what == Constant.GET_DATA_ERROR){   //获取数据异常
				progress.setVisibility(View.GONE);
				tryAgain.setVisibility(View.VISIBLE);
				empty.setVisibility(View.VISIBLE);
				ToastUtil.showToast(HomeActivity.this, "加载数据异常,请重试!");
			}
		}
		
	};
	
	public void refresh(Message msg){
		handler.sendMessage(msg);
		System.out.println("refresh ------------->!!!");
	}
	/**
	 * 刷新方法重新加载微博数据
	 */
	public void refresh(){
		if(progress.isShown()){
			ToastUtil.showToast(this, "正在加载数据,请稍后...");
		}else{
			getStatus();
			progress.setVisibility(View.VISIBLE);
		}
	}
	
	@Override
	protected void onResume() { //注册sensorManager
		super.onResume();
		sensorManager.registerListener(this, 
				sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 
				SensorManager.SENSOR_DELAY_NORMAL);
	}
	
	@Override
	protected void onPause() {
		super.onPause();
		sensorManager.unregisterListener(this); //程序结束注销
	}
	
	@Override
	public void onSensorChanged(SensorEvent event) {
		int sensorType = event.sensor.getType();  
        //values[0]:X轴,values[1]:Y轴,values[2]:Z轴  
        float[] values = event.values;  
        if(sensorType == Sensor.TYPE_ACCELEROMETER){              
            if((Math.abs(values[0]) > 18 || Math.abs(values[1]) > 18 || Math.abs(values[2]) > 18)){  
                if(progress.isShown()){
        			ToastUtil.showToast(this, "正在刷新,请稍后...");
        		}
        		else{
        			refresh(); //重新开启任务
        			//摇动手机后,再伴随震动提示~~  
        			vibrator.vibrate(300);
        			progress.setVisibility(View.VISIBLE);
        		}
            }  
        }
	}

	@Override
	public void onAccuracyChanged(Sensor sensor, int accuracy) {
		
	}
}
getHomeTimeline()返回的是一个List<Satus>类型的数据,我们要自定义一个Adapter为listView设置微博数据!请参考下一篇:新浪微博开发之为listView设置微博数据

运行效果如下:

                   

就写那么多,有问题请留言大家一起交流学习!

说明:转载请注明出处!



1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:237901次
    • 积分:2538
    • 等级:
    • 排名:第15050名
    • 原创:55篇
    • 转载:11篇
    • 译文:2篇
    • 评论:86条
    文章分类
    最新评论