[转载]android开发我的新浪微博客户端-用户首页面功能篇(5.2)

[转载]android开发我的新浪微博客户端-用户首页面功能篇(5.2) – 遇见未知的自己 – 博客园.

上一篇完成用户首页的UI实现,本篇接下来讲功能部分的实现,本页面主要的功能就用户关注的最新微博列表,从上一篇中知道本列表是用ID为Msglist的ListView控件来实现,本篇的主要就讲解如果获取微博列表数据给这个ListView提供显示数据。ListView每一条子数据分别由用户头像、用户昵称、发布时间、是否包含照片、微博内容这五部分组成,根据这五部分定义一个名为WeiBoInfo.java实体类,代码如下:

代码

public class WeiBoInfo {
//文章id
private String id;
public String getId(){
return id;
}
public void setId(String id){
this.id=id;
}
//发布人id
private String userId;
public String getUserId(){
return userId;
}
public void setUserId(String userId){
this.userId=userId;
}

//发布人名字
private String userName;
public String getUserName(){
return userName;
}
public void setUserName(String userName){
this.userName=userName;
}

//发布人头像
private String userIcon;
public String getUserIcon(){
return userIcon;
}
public void setUserIcon(String userIcon){
this.userIcon=userIcon;
}

//发布时间
private String time;
public String getTime(){
return time;
}
public void setTime(String time)
{
this.time=time;
}

//是否有图片
private Boolean haveImage=false;
public Boolean getHaveImage(){
return haveImage;
}
public void setHaveImage(Boolean haveImage){
this.haveImage=haveImage;
}

//文章内容
private String text;
public String getText(){
return text;
}
public void setText(String text){
this.text=text;
}

}

然后在res/layout目录下新建名为weibo.xml的Layout用来控制ListView子项的显示部件,代码很简单不多解释了,直接看下面代码:

代码

<?xml version=”1.0″ encoding=”utf-8″?>
<LinearLayout
xmlns:Android=”http://schemas.Android.com/apk/res/android”
android:layout_width
=”wrap_content”
android:layout_height
=”wrap_content”
android:orientation
=”horizontal”>
<ImageView
android:id=”@+id/wbicon”
android:layout_width
=”wrap_content”
android:layout_height
=”wrap_content”
android:src
=”@drawable/usericon”
android:layout_margin
=”8px”>
</ImageView>
<LinearLayout
android:layout_width=”fill_parent”
android:layout_height
=”wrap_content”
android:orientation
=”vertical”
android:paddingLeft
=”0px”
android:paddingRight
=”5px”
android:layout_marginTop
=”5px”
android:layout_marginBottom
=”5px”>
<RelativeLayout
android:layout_width=”fill_parent”
android:layout_height
=”wrap_content”>
<TextView
android:id=”@+id/wbuser”
android:layout_width
=”wrap_content”
android:layout_height
=”wrap_content”
android:textSize
=”15px”
android:textColor
=”#424952″
android:layout_alignParentLeft
=”true”>
</TextView>
<ImageView
android:id=”@+id/wbimage”
android:layout_width
=”wrap_content”
android:layout_height
=”wrap_content”
android:layout_marginTop
=”3px”
android:layout_marginRight
=”5px”
android:layout_toLeftOf
=”@+id/wbtime”>
</ImageView>
<TextView
android:id=”@+id/wbtime”
android:layout_width
=”wrap_content”
android:layout_height
=”wrap_content”
android:layout_alignParentRight
=”true”
android:textColor
=”#f7a200″
android:textSize
=”12px”>
</TextView>
</RelativeLayout>
<TextView
android:id=”@+id/wbtext”
android:layout_width
=”wrap_content”
android:layout_height
=”wrap_content”
android:textColor
=”#424952″
android:textSize
=”13px”
android:layout_marginTop
=”4px”>
</TextView>
</LinearLayout>
</LinearLayout>

接下来为列表控件定义一个数据Adapter,代码如下:

代码

private List<WeiBoInfo> wbList;

//微博列表Adapater
public class WeiBoAdapater extends BaseAdapter{

private AsyncImageLoader asyncImageLoader;

@Override
public int getCount() {
return wbList.size();
}

@Override
public Object getItem(int position) {
return wbList.get(position);
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
asyncImageLoader
= new AsyncImageLoader();
convertView
= LayoutInflater.from(getApplicationContext()).inflate(R.layout.weibo, null);
WeiBoHolder wh
= new WeiBoHolder();
wh.wbicon
= (ImageView) convertView.findViewById(R.id.wbicon);
wh.wbtext
= (TextView) convertView.findViewById(R.id.wbtext);
wh.wbtime
= (TextView) convertView.findViewById(R.id.wbtime);
wh.wbuser
= (TextView) convertView.findViewById(R.id.wbuser);
wh.wbimage
=(ImageView) convertView.findViewById(R.id.wbimage);
WeiBoInfo wb
= wbList.get(position);
if(wb!=null){
convertView.setTag(wb.getId());
wh.wbuser.setText(wb.getUserName());
wh.wbtime.setText(wb.getTime());
wh.wbtext.setText(wb.getText(), TextView.BufferType.SPANNABLE);
textHighlight(wh.wbtext,
new char[]{#},new char[]{#});
textHighlight(wh.wbtext,
new char[]{@},new char[]{:, });
textHighlight2(wh.wbtext,
http://, );

if(wb.getHaveImage()){
wh.wbimage.setImageResource(R.drawable.images);
}
Drawable cachedImage
= asyncImageLoader.loadDrawable(wb.getUserIcon(),wh.wbicon, new ImageCallback(){

@Override
public void imageLoaded(Drawable imageDrawable,ImageView imageView, String imageUrl) {
imageView.setImageDrawable(imageDrawable);
}

});
if (cachedImage == null) {
wh.wbicon.setImageResource(R.drawable.usericon);
}
else{
wh.wbicon.setImageDrawable(cachedImage);
}
}

return convertView;
}

上面的这个Adapter实现没有什么特别的很普通,不过这个中使用了AsyncImageLoader的方法,这个是用来实现用户头像图标的异步载入显示,这样能提高列表显示的速度,提高用户体验,AsyncImageLoader的代码如下:

代码

public class AsyncImageLoader {
//SoftReference是软引用,是为了更好的为了系统回收变量
private HashMap<String, SoftReference<Drawable>> imageCache;
public AsyncImageLoader() {
imageCache
= new HashMap<String, SoftReference<Drawable>>();
}

public Drawable loadDrawable(final String imageUrl,final ImageView imageView, final ImageCallback imageCallback){
if (imageCache.containsKey(imageUrl)) {
//从缓存中获取
SoftReference<Drawable> softReference = imageCache.get(imageUrl);
Drawable drawable
= softReference.get();
if (drawable != null) {
return drawable;
}
}
final Handler handler = new Handler() {
public void handleMessage(Message message) {
imageCallback.imageLoaded((Drawable) message.obj, imageView,imageUrl);
}
};
//建立新一个新的线程下载图片
new Thread() {
@Override
public void run() {
Drawable drawable
= loadImageFromUrl(imageUrl);
imageCache.put(imageUrl,
new SoftReference<Drawable>(drawable));
Message message
= handler.obtainMessage(0, drawable);
handler.sendMessage(message);
}
}.start();
return null;
}

public static Drawable loadImageFromUrl(String url){
URL m;
InputStream i
= null;
try {
m
= new URL(url);
i
= (InputStream) m.getContent();
}
catch (MalformedURLException e1) {
e1.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
Drawable d
= Drawable.createFromStream(i, src);
return d;
}

//回调接口
public interface ImageCallback {
public void imageLoaded(Drawable imageDrawable,ImageView imageView, String imageUrl);
}
}

完成上述的工作后,接下来就是显示微薄列表, 在HomeActivity的onCreate方法中调用loadList();代码如下:

代码

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.home);

。。。。。。
loadList();
}

private void loadList(){
if(ConfigHelper.nowUser==null)
{

}
else
{
user
=ConfigHelper.nowUser;
//显示当前用户名称
TextView showName=(TextView)findViewById(R.id.showName);
showName.setText(user.getUserName());

OAuth auth=new OAuth();
String url
= http://api.t.sina.com.cn/statuses/friends_timeline.json;
List params
=new ArrayList();
params.add(
new BasicNameValuePair(source, auth.consumerKey));
HttpResponse response
=auth.SignRequest(user.getToken(), user.getTokenSecret(), url, params);
if (200 == response.getStatusLine().getStatusCode()){
try {
InputStream is
= response.getEntity().getContent();
Reader reader
= new BufferedReader(new InputStreamReader(is), 4000);
StringBuilder buffer
= new StringBuilder((int) response.getEntity().getContentLength());
try {
char[] tmp = new char[1024];
int l;
while ((l = reader.read(tmp)) != 1) {
buffer.append(tmp,
0, l);
}
}
finally {
reader.close();
}
String string
= buffer.toString();
//Log.e(“json”, “rs:” + string);
response.getEntity().consumeContent();
JSONArray data
=new JSONArray(string);
for(int i=0;i<data.length();i++)
{
JSONObject d
=data.getJSONObject(i);
//Log.e(“json”, “rs:” + d.getString(“created_at”));
if(d!=null){
JSONObject u
=d.getJSONObject(user);
if(d.has(retweeted_status)){
JSONObject r
=d.getJSONObject(retweeted_status);
}

//微博id
String id=d.getString(id);
String userId
=u.getString(id);
String userName
=u.getString(screen_name);
String userIcon
=u.getString(profile_image_url);
Log.e(
userIcon, userIcon);
String time
=d.getString(created_at);
String text
=d.getString(text);
Boolean haveImg
=false;
if(d.has(thumbnail_pic)){
haveImg
=true;
//String thumbnail_pic=d.getString(“thumbnail_pic”);
//Log.e(“thumbnail_pic”, thumbnail_pic);
}

Date date=new Date(time);
time
=ConvertTime(date);
if(wbList==null){
wbList
=new ArrayList<WeiBoInfo>();
}
WeiBoInfo w
=new WeiBoInfo();
w.setId(id);
w.setUserId(userId);
w.setUserName(userName);
w.setTime(time);
w.setText(text);

w.setHaveImage(haveImg);
w.setUserIcon(userIcon);
wbList.add(w);
}
}

}catch (IllegalStateException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
catch (JSONException e) {
e.printStackTrace();
}
}

if(wbList!=null)
{
WeiBoAdapater adapater
= new WeiBoAdapater();
ListView Msglist
=(ListView)findViewById(R.id.Msglist);
Msglist.setOnItemClickListener(
new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> arg0, View view,int arg2, long arg3) {
Object obj
=view.getTag();
if(obj!=null){
String id
=obj.toString();
Intent intent
= new Intent(HomeActivity.this,ViewActivity.class);
Bundle b
=new Bundle();
b.putString(
key, id);
intent.putExtras(b);
startActivity(intent);
}
}

});
Msglist.setAdapter(adapater);
}
}
loadingLayout.setVisibility(View.GONE);
}

上面的loadList() 方法通过新浪Api接口http://api.t.sina.com.cn/statuses/friends_timeline.json获取当前登录用户及其所关注用户的最新微博消息,然后显示到列表中。

这样就完成了用户首页功能的开发。

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏