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获取当前登录用户及其所关注用户的最新微博消息,然后显示到列表中。

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