android应用中常会出现这样的布局,就是一个listview高度上下顶着屏幕的高度,由于listview是直接从第一个item就开始显示,所以第一个item与屏幕之间就不会有间隔,但是这样是不美观的,我们希望有一定的间距,好说,加个layout_marginTop 不就可以了吗,可是为了在美观 一点还要在屏幕的顶端加个虚化的处理,或者希望这个间距会随着item的滚动而移出屏幕,这样的话layout_marginTop就不能满足要求了。 此时就该用到了addHeaderView()与addFooterView() ,顾名思义:给listview添加一个头一个脚。(header与footer是listview的一部分,所以会随着item的滚动而滚动)
效果图:
滑动中
AddHeader.java:
package com.yjl.mytools;
import android. content. Context;
import android. view. View;
import android. widget. ImageView;
import android. widget. LinearLayout ;
import android. widget. ListView;
/**
* @author YJL
*/
public class AddHeader extends View {
public AddHeader (Context context ) {
super (context );
// TODO Auto-generated constructor stub
}
/**
* @param mContext 上下文
* @param lvListView 添加footer的listview
* @param height header的高度
*/
public static void addH( Context mContext, ListView lvListView , int height) {
LinearLayout headerParent = new LinearLayout (mContext );
ImageView header = new ImageView( mContext) ;
LinearLayout .LayoutParams lpParamsH = new LinearLayout .LayoutParams (
LinearLayout .LayoutParams .FILL_PARENT , UnitTransform .dip2px ( //高度 dp转px
mContext, height ));
header. setLayoutParams (lpParamsH );
headerParent .addView (header );
lvListView. addHeaderView (headerParent , null , false) ;//添加的item为false不可点击
header. setVisibility (View .INVISIBLE );
}
}
package com.yjl.mytools;
import android.content.Context;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
/**
* @author YJL
*/
public class AddFooter extends View {
public AddFooter(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
/**
* @param mContext 上下文
* @param lvListView 添加footer的listview
* @param height header的高度
*/
public static void addF(Context mContext, ListView lvListView, int height) {
LinearLayout footerParent = new LinearLayout(mContext);
ImageView footer = new ImageView(mContext);
LinearLayout.LayoutParams lParamsF = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT, UnitTransform.dip2px( //高度 dp转px
mContext, height));
footer.setLayoutParams(lParamsF);
footerParent.addView(footer);
lvListView.addFooterView(footerParent, null, false);//添加的item为false不可点击
footer.setVisibility(View.INVISIBLE);
}
}
//初始化listview
m_ListView = (ListView) findViewById(R.id.androidlist);
// 为ListView 添加header
// (注意添加位置,应该在onCreate()中加,否则改变view时会多次创建header,即不断的添加header)
AddHeader.addH(mContext, m_ListView, 24);
// 为ListView 添加footer
AddFooter.addF(mContext, m_ListView, 24);
...
//注意setAdapter与addHeader的顺序
m_ListView.setAdapter(adapter);
...
首先新建xml文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:id="@+id/synmediaplay"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:background="@drawable/mediapaly_button_select" />
<ImageView
android:layout_width="match_parent"
android:layout_height="1px"
android:background="@drawable/content_diving_line_h" />
</LinearLayout>
新建header的item布局后,在相应的activity中初始化listview后调用(注:一定要在setAdapter之前调用才可以,否则会报错)
listView01 = (ListView ) findViewById (R .id .list01 );
listView01. addHeaderView (
LayoutInflater .from ( this) .inflate (R .layout .synteach_header ,
null ), null , false );
最后如果我们要给listview的item添加监听setOnItemClickListener( public void onItemClick(AdapterView<?> parent, View view,intposition, long id) { ) 时,这里的position要减去我们自己添加的header的个数,这样其正常的listview的item点击的位置才会正常匹配。