Android控件组合应用四

接上一篇,我们已经有了自定义的ListView了,在其中具备了Header和Footer,现在这个ListView已经可以在多个类似的界面中使用了,而且Header和Footer都可以使用更复杂的View来实现。

接下来,是为ListView添加数据的时候了,根据《Android控件组合应用一》一文中对数据结构的描述,我们在MainActivity中添加一个方法initSite()用于构造测试数据。该类的代码如下:

 

  1. package com.wenbin.test;  
  2.   
  3. import com.wenbin.test.site.Blog;  
  4. import com.wenbin.test.site.SinaSite;  
  5. import com.wenbin.test.site.Site;  
  6. import com.wenbin.test.site.User;  
  7.   
  8. import android.app.Activity;  
  9. import android.os.Bundle;  
  10. import android.view.View;  
  11. import android.view.View.OnClickListener;  
  12. import android.widget.AdapterView;  
  13. import android.widget.AdapterView.OnItemClickListener;  
  14. import android.widget.TextView;  
  15.   
  16. public class MainActivity extends Activity implements OnItemClickListener {  
  17.     private TextView usernameTextview;  
  18.     private Site site;  
  19.       
  20.     @Override  
  21.     public void onCreate(Bundle savedInstanceState) {  
  22.         super.onCreate(savedInstanceState);  
  23.         setContentView(R.layout.main);  
  24.           
  25.         initSite();  
  26.           
  27.         usernameTextview=(TextView)findViewById(R.id.TextViewUsername);  
  28.         BlogListView sinaListView=(BlogListView)findViewById(R.id.sinaList);  
  29.         sinaListView.setOnItemClickListener(this);  
  30.         sinaListView.init(site);  
  31.           
  32.         findViewById(R.id.BtnWrite).setOnClickListener(new OnClickListener() {  
  33.             @Override  
  34.             public void onClick(View v) {  
  35.                 //TODO:  
  36.             }  
  37.         });  
  38.           
  39.         findViewById(R.id.BtnRefresh).setOnClickListener(new OnClickListener() {  
  40.             @Override  
  41.             public void onClick(View v) {  
  42.                 //TODO:  
  43.             }  
  44.         });  
  45.           
  46.         updateUserNameTextView();  
  47.     }  
  48.   
  49.     private void updateUserNameTextView() {  
  50.         usernameTextview.setText(R.string.unAuthUser);  
  51.     }  
  52.       
  53.     @Override  
  54.     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {  
  55.         //TODO:  
  56.     }  
  57.       
  58.     private void initSite(){  
  59.         site=new SinaSite();  
  60.   
  61.         Blog blog=new Blog(site);  
  62.         blog.setPic("http://ww3.sinaimg.cn/thumbnail/6b8527b3jw6dbydoikpzuj.jpg");  
  63.         User user=new User();  
  64.         user.setVerified(true);  
  65.         blog.setUser(user);  
  66.         site.addBlog(blog);  
  67.           
  68.         blog=new Blog(site);  
  69.         user=new User();  
  70.         user.setVerified(true);  
  71.         blog.setUser(user);  
  72.         Blog retBlog=new Blog();  
  73.         user=new User();  
  74.         user.setProfileImageUrl("");  
  75.         user.setScreenName("reply");  
  76.         retBlog.setUser(user);  
  77.         retBlog.setText("[爱你]求喜欢");  
  78.         retBlog.setPic("http://tp4.sinaimg.cn/1658122963/50/1282754213");  
  79.         blog.setRetweetedBlog(retBlog);  
  80.         site.addBlog(blog);  
  81.           
  82.         for(int i=0;i<5;i++){  
  83.             try {  
  84.                 Thread.sleep(200);  
  85.             } catch (InterruptedException e) {  
  86.                 e.printStackTrace();  
  87.             }  
  88.             user=new User();  
  89.             blog=new Blog(site);  
  90.             blog.setUser(user);  
  91.             site.addBlog(blog);  
  92.         }  
  93.     }  
  94. }  

然后,我们为每个列表项来写一个布局文件blogview.xml,布局如下:

 

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout  
  3.   xmlns:android="http://schemas.android.com/apk/res/android"  
  4.   android:layout_width="fill_parent"  
  5.   android:layout_height="wrap_content"  
  6.   android:orientation="vertical"  
  7.   android:padding="10dp" android:descendantFocusability="blocksDescendants"  
  8.   android:background="@color/white">  
  9.   <RelativeLayout android:layout_width="fill_parent"   
  10.     android:layout_height="fill_parent" >  
  11.     <WebView android:id="@+id/profileImage"  
  12.         android:layout_width="48dp"  
  13.         android:layout_height="48dp"  
  14.         android:scrollbars="none"  
  15.         android:layout_alignParentLeft="true"  
  16.         android:background="@drawable/portrait">  
  17.     </WebView>  
  18.     <ImageView android:id="@+id/vImage"  
  19.         android:layout_width="wrap_content"  
  20.         android:layout_height="wrap_content"  
  21.         android:layout_alignRight="@+id/profileImage"  
  22.         android:layout_alignBottom="@+id/profileImage"  
  23.         android:src="@drawable/v">  
  24.     </ImageView>  
  25.     <RelativeLayout android:layout_alignParentRight="true"  
  26.         android:layout_toRightOf="@+id/profileImage"  
  27.         android:layout_width="fill_parent"  
  28.         android:layout_height="fill_parent"  
  29.         android:layout_marginLeft="10dp">  
  30.         <TextView android:id="@+id/userName" android:layout_height="wrap_content" android:layout_alignParentTop="true"  
  31.             android:textColor="@color/red"  
  32.             android:textSize="15sp"  
  33.             android:paddingBottom="5dp" android:layout_width="fill_parent">  
  34.         </TextView>  
  35.         <TextView android:id="@+id/blogText" android:layout_height="wrap_content"  
  36.             android:layout_below="@+id/userName"  
  37.             android:textColor="@color/black"  
  38.             android:textSize="15sp" android:layout_width="wrap_content">  
  39.         </TextView>  
  40.         <WebView android:id="@+id/smallImage"  
  41.             android:layout_width="68dp"  
  42.             android:layout_height="48dp"  
  43.             android:scrollbars="none"  
  44.             android:layout_below="@+id/blogText"  
  45.             android:background="@drawable/image">  
  46.         </WebView>      
  47.         <RelativeLayout android:layout_width="fill_parent"   
  48.             android:layout_height="wrap_content"  
  49.             android:layout_below="@+id/smallImage"  
  50.             android:background="@drawable/popup"  
  51.             android:paddingTop="10dp"  
  52.             android:paddingBottom="5dp"  
  53.             android:paddingLeft="5dp"  
  54.             android:paddingRight="5dp"  
  55.             android:id="@+id/reBlog">  
  56.             <TextView android:id="@+id/reBlogText" android:layout_width="fill_parent"  
  57.                 android:layout_height="wrap_content"  
  58.                 android:layout_below="@+id/reUserName"  
  59.                 android:textColor="@color/black"  
  60.                 android:textSize="15sp">  
  61.             </TextView>     
  62.             <WebView android:id="@+id/reImage"  
  63.                 android:layout_width="68dp"  
  64.                 android:layout_height="48dp"  
  65.                 android:scrollbars="none"  
  66.                 android:layout_below="@+id/reBlogText"  
  67.                 android:background="@drawable/image">  
  68.             </WebView>          
  69.         </RelativeLayout>   
  70.         <TextView android:id="@+id/sourceText" android:layout_width="fill_parent"  
  71.             android:layout_height="wrap_content"   
  72.             android:layout_alignLeft="@+id/userName"  
  73.             android:layout_below="@+id/reBlog"  
  74.             android:textColor="@color/blue"  
  75.             android:textSize="10sp"  
  76.             android:paddingBottom="5dp">  
  77.         </TextView>     
  78.     </RelativeLayout>  
  79.   </RelativeLayout>  
  80. </LinearLayout>  

至此,可以通过派生ListAdapter来实现我们的Adapter了,代码如下:

 

  1. package com.wenbin.test;  
  2.   
  3. import java.util.Iterator;  
  4. import java.util.Set;  
  5.   
  6. import com.wenbin.test.site.Blog;  
  7. import android.content.Context;  
  8. import android.database.DataSetObserver;  
  9. import android.view.LayoutInflater;  
  10. import android.view.View;  
  11. import android.view.ViewGroup;  
  12. import android.webkit.WebView;  
  13. import android.widget.Adapter;  
  14. import android.widget.ImageView;  
  15. import android.widget.ListAdapter;  
  16. import android.widget.TextView;  
  17.   
  18. public class BlogAdapter implements ListAdapter {  
  19.     private static final String AT = "@";     
  20.     private static final String COLON=": ";  
  21.       
  22.     private Set<Blog> blogs;  
  23.     private Context context;  
  24.       
  25.     public BlogAdapter(Set<Blog> blogs,Context context){  
  26.         this.blogs=blogs;  
  27.         this.context=context;  
  28.     }  
  29.   
  30.     @Override  
  31.     public boolean areAllItemsEnabled() {  
  32.         return true;  
  33.     }  
  34.   
  35.     @Override  
  36.     public boolean isEnabled(int arg0) {  
  37.         return true;  
  38.     }  
  39.   
  40.     @Override  
  41.     public int getCount() {  
  42.         return blogs.size();  
  43.     }  
  44.   
  45.     @Override  
  46.     public Blog getItem(int position) {  
  47.         if (position<0 || position>=getCount())  
  48.             return null;  
  49.       
  50.         if (blogs!=null){  
  51.             Iterator<Blog> iterator=blogs.iterator();  
  52.             int i=0;  
  53.             while(iterator.hasNext()){  
  54.                 if (i==position){  
  55.                     return iterator.next();  
  56.                 }  
  57.                 else{  
  58.                     iterator.next();  
  59.                     i++;  
  60.                 }  
  61.             }  
  62.         }  
  63.         return null;  
  64.     }  
  65.   
  66.     @Override  
  67.     public long getItemId(int position) {  
  68.         return 0;  
  69.     }  
  70.   
  71.     @Override  
  72.     public int getItemViewType(int position) {  
  73.         return Adapter.IGNORE_ITEM_VIEW_TYPE;  
  74.     }  
  75.   
  76.     @Override  
  77.     public View getView(int position, View convertView, ViewGroup parent) {  
  78.         View view=null;  
  79.         if (convertView==null){  
  80.             LayoutInflater li=LayoutInflater.from(context);  
  81.             view=li.inflate(R.layout.blogview, null);  
  82.         }  
  83.         else{  
  84.             view=convertView;  
  85.         }  
  86.   
  87.         Blog blog=getItem(position);  
  88.         if (blog!=null){  
  89.             updateBlogView(view, blog);  
  90.               
  91.             if (blog.isHaveRetweetedBlog()&& blog.getInReplyBlogText().length()>0){  
  92.                 updateRetweeteBlogView(view, blog);  
  93.             }  
  94.             else{  
  95.                 view.findViewById(R.id.reBlog).setVisibility(View.GONE);  
  96.                 view.findViewById(R.id.reImage).setVisibility(View.GONE);  
  97.             }  
  98.         }  
  99.         view.setTag(blog);  
  100.         return view;  
  101.     }  
  102.   
  103.     /** 
  104.      * @param view 
  105.      * @param blog 
  106.      */  
  107.     private void updateBlogView(View view, Blog blog) {  
  108.         TextView userName=(TextView)view.findViewById(R.id.userName);  
  109.         TextView blogText=(TextView)view.findViewById(R.id.blogText);  
  110.         WebView profileImage=(WebView)view.findViewById(R.id.profileImage);  
  111.         ImageView vImage=(ImageView)view.findViewById(R.id.vImage);  
  112.         WebView smallImage=(WebView)view.findViewById(R.id.smallImage);  
  113.         TextView sourceText=(TextView)view.findViewById(R.id.sourceText);  
  114.   
  115.         userName.setText(blog.getUser().getScreenName());  
  116.         sourceText.setText(context.getString(R.string.from)+blog.getSource());  
  117.               
  118.         blogText.setText(blog.getText());  
  119.         profileImage.loadUrl(blog.getUser().getProfileImageUrl());  
  120.           
  121.         if (!blog.getUser().isVerified())  
  122.             vImage.setVisibility(View.INVISIBLE);  
  123.         if (blog.getSmallPic().length()>0){  
  124.             smallImage.loadUrl(blog.getSmallPic());  
  125.         }  
  126.         else{  
  127.             smallImage.setVisibility(View.GONE);  
  128.         }  
  129.     }  
  130.   
  131.     /** 
  132.      * @param view 
  133.      * @param blog 
  134.      */  
  135.     private void updateRetweeteBlogView(View view, Blog blog) {  
  136.         TextView reBlogText=(TextView)view.findViewById(R.id.reBlogText);  
  137.         WebView reImage=(WebView)view.findViewById(R.id.reImage);  
  138.   
  139.         if (blog.getInReplyBlogText().length()>0){  
  140.             if (blog.getInReplyUserScreenName().length()>0){  
  141.                 reBlogText.setText(AT+blog.getInReplyUserScreenName()+COLON+blog.getInReplyBlogText());  
  142.             }  
  143.             else{  
  144.                 reBlogText.setText(blog.getInReplyBlogText());  
  145.             }  
  146.         }  
  147.         else{  
  148.             reBlogText.setVisibility(View.GONE);  
  149.         }  
  150.           
  151.         if (blog.getRetweetedBlog().getSmallPic().length()>0){  
  152.             reImage.loadUrl(blog.getRetweetedBlog().getSmallPic());  
  153.         }  
  154.         else{  
  155.             reImage.setVisibility(View.GONE);  
  156.         }  
  157.     }  
  158.   
  159.     @Override  
  160.     public int getViewTypeCount() {  
  161.         return 1;    
  162.     }  
  163.   
  164.     @Override  
  165.     public boolean hasStableIds() {  
  166.         return false;  
  167.     }  
  168.   
  169.     @Override  
  170.     public boolean isEmpty() {  
  171.         return false;  
  172.     }  
  173.   
  174.     @Override  
  175.     public void registerDataSetObserver(DataSetObserver observer) {  
  176.   
  177.     }  
  178.   
  179.     @Override  
  180.     public void unregisterDataSetObserver(DataSetObserver observer) {  
  181.   
  182.     }  
  183.   
  184. }  

 

运行,界面如下图所示:

 

初具雏形,还差的细节包括:表情符未显示,@昵称未高亮显示,URL未展现成链接,图片的外围有白框,图片下载过程中无默认背景。好吧,欲知后事如何,且看下篇分解。

 

——欢迎转载,转载请注明出处 http://blog.csdn.net/caowenbin ——

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值