Android控件组合应用三

来源:互联网 发布:ubuntu系统能干什么 编辑:程序博客网 时间:2024/05/02 00:59

上一篇文章中,我们先利用ImageButton控件和RelativeLayout进行了一些热身运动,接下来,ListView登场。

 

看新浪微博的界面,给我们的第一感觉应该是用了ListView,但是仔细一想,又觉得在ListView中难以实现这么复杂的显示。我们不妨就用ListView,看看能否仿制出来他的效果。

 

对于ListView来说,现在每一个项,即其中每一个Item都不再是我们熟悉的简单的复选框,或者多行文本,而是图文并茂并且有布局要求的形态。除此之外,还要注意到,这个列表框的第一项和最后一项是固定的,分别放置了“刷新”和“更多”两个Item,无论列表框中有多少项,这两个Item都存在。如果能把这两个Item作为列表框的一个不变的组成部分,而只是用数据填充中间有数据项,应该就差不多了。

 

基于上述观察和分析,我们可以通过为ListView添加HeaderView和FooterView来解决这两个特殊的Item问题,既然是两个View,那我们就先添加两个布局的xml,分别作为HeaderView和FooterView。文件内容如下:

 

view plain
  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="fill_parent"  
  6.   android:gravity="center"  
  7.   android:background="@color/white">  
  8.     <TextView android:id="@+id/textHeader"   
  9.         android:layout_width="wrap_content"   
  10.         android:layout_height="wrap_content"  
  11.         android:paddingTop="15dp"  
  12.         android:paddingBottom="15dp"  
  13.         android:layout_gravity="center_horizontal"  
  14.         android:text="@string/refresh"  
  15.         android:textColor="@color/black"  
  16.         android:textSize="15sp">  
  17.     </TextView>  
  18. </LinearLayout>  
view plain
  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="fill_parent"  
  6.   android:gravity="center"  
  7.   android:background="@color/white">  
  8.     <TextView android:id="@+id/textfooter"   
  9.         android:layout_width="wrap_content"   
  10.         android:layout_height="wrap_content"  
  11.         android:paddingTop="15dp"  
  12.         android:paddingBottom="15dp"  
  13.         android:layout_gravity="center_horizontal"  
  14.         android:text="@string/more"  
  15.         android:textColor="@color/black"  
  16.         android:textSize="15sp">  
  17.     </TextView>  
  18. </LinearLayout>  

 

有了这两个布局文件,就可以自定义我们自己的ListView了,新建一个BlogListView的class,继承自ListView。

 

现在的问题是什么时候把这两个view加进来呢,思考ing……没错,在该控件完成布局的时候就要加进来了,该类的代码如下:

 

view plain
  1. package com.wenbin.test;  
  2.   
  3. import com.wenbin.test.site.Site;  
  4. import android.content.Context;  
  5. import android.util.AttributeSet;  
  6. import android.view.LayoutInflater;  
  7. import android.view.View;  
  8. import android.widget.ListView;  
  9.   
  10. public class BlogListView extends ListView {  
  11.     private Site site;  
  12.       
  13.     public BlogListView(Context context) {  
  14.         super(context);  
  15.     }  
  16.   
  17.     public BlogListView(Context context, AttributeSet attrs) {  
  18.         super(context, attrs);  
  19.     }  
  20.   
  21.     public BlogListView(Context context, AttributeSet attrs, int defStyle) {  
  22.         super(context, attrs, defStyle);  
  23.     }  
  24.   
  25.     @Override  
  26.     protected void onFinishInflate() {  
  27.         super.onFinishInflate();  
  28.         LayoutInflater li=LayoutInflater.from(getContext());  
  29.         View headerView=li.inflate(R.layout.bloglistheader, null);  
  30.         headerView.setOnClickListener(new OnClickListener(){  
  31.             @Override  
  32.             public void onClick(View v) {  
  33.                 refresh();  
  34.             }             
  35.         });  
  36.         View footerView=li.inflate(R.layout.bloglistfooter, null);  
  37.         footerView.setOnClickListener(new OnClickListener(){  
  38.             @Override  
  39.             public void onClick(View v) {  
  40.                 more();  
  41.             }             
  42.         });  
  43.         addHeaderView(headerView);  
  44.         addFooterView(footerView);  
  45.     }  
  46.   
  47.     public void init(Site site){  
  48.         this.site=site;  
  49.         if (site!=null && site.getBlogsCount()>0){  
  50.             setAdapter(new BlogAdapter(site.getBlogs(),getContext()));  
  51.         }  
  52.     }  
  53.       
  54.     public void refresh() {  
  55.         //TODO:  
  56.     }  
  57.   
  58.     public void more(){  
  59.         //TODO:  
  60.     }  
  61.   
  62.     public Site getSite(){  
  63.         return site;  
  64.     }  
  65. }  

由于是自定义控件,所以要在main.xml中加入它的话,得把布局写成下面这样:

 

view plain
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout   
  3.     android:layout_width="fill_parent" android:layout_height="fill_parent"  
  4.     xmlns:android="http://schemas.android.com/apk/res/android"  
  5.     android:orientation="vertical">  
  6.     <RelativeLayout   
  7.         android:layout_width="fill_parent" android:layout_height="44dp"  
  8.         android:background="@drawable/titlebar_lightgray_bg" android:orientation="horizontal">  
  9.         <ImageButton android:id="@+id/BtnWrite"  
  10.             android:layout_width="wrap_content" android:layout_height="fill_parent"  
  11.             android:layout_alignParentLeft="true" android:background="@android:color/transparent"  
  12.             android:src="@drawable/write_button">  
  13.         </ImageButton>  
  14.         <TextView android:id="@+id/TextViewUsername"  
  15.             android:layout_width="fill_parent" android:layout_height="fill_parent"  
  16.             android:textColor="@color/black" android:gravity="center" android:textSize="18sp">  
  17.         </TextView>  
  18.         <ImageButton android:id="@+id/BtnRefresh"  
  19.             android:layout_width="wrap_content" android:layout_height="fill_parent"  
  20.             android:layout_alignParentRight="true" android:background="@android:color/transparent"  
  21.             android:src="@drawable/refresh_button">  
  22.         </ImageButton>  
  23.     </RelativeLayout>  
  24.     <com.wenbin.test.BlogListView android:id="@+id/sinaList" android:layout_width="fill_parent"  
  25.         android:layout_height="fill_parent" android:clickable="true"  
  26.         android:divider="@drawable/divider" android:dividerHeight="1dp">  
  27.     </com.wenbin.test.BlogListView>  
  28. </LinearLayout>  

其中的divider属性是定义Item间的分隔条的。

 

最后,运行结果发现没有显示出列表来,那是因为它没有数据,为ListView加简单的测试数据例如数组这事就不在这写代码了,反正接下来就该添加正式的数据了。

原创粉丝点击