上一篇完成用户首页的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子项的显示部件,代码很简单不多解释了,直接看下面代码:
- xmlns:=""
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:orientation="horizontal">
-
- android:id="@+id/wbicon"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:src="@drawable/usericon"
- android:layout_margin="8px">
-
-
- 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">
-
- android:layout_width="fill_parent"
- android:layout_height="wrap_content">
-
- android:id="@+id/wbuser"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textSize="15px"
- android:textColor="#424952"
- android:layout_alignParentLeft="true">
-
-
- 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">
-
-
- android:id="@+id/wbtime"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignParentRight="true"
- android:textColor="#f7a200"
- android:textSize="12px">
-
-
-
- android:id="@+id/wbtext"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textColor="#424952"
- android:textSize="13px"
- android:layout_marginTop="4px">
-
-
-
复制代码 接下来为列表控件定义一个数据Adapter,代码如下:
- private List 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> imageCache;
- public AsyncImageLoader() {
- imageCache = new HashMap>();
- }
-
- public Drawable loadDrawable(final String imageUrl,final ImageView imageView, final ImageCallback imageCallback){
- if (imageCache.containsKey(imageUrl)) {
- //从缓存中获取
- SoftReference 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));
- 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 = "";
- 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
- {
- 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 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接口获取当前登录用户及其所关注用户的最新微博消息,然后显示到列表中。 这样就完成了用户首页功能的开发。
阅读(959) | 评论(0) | 转发(0) |