android listview addHeaderView和addFooterView

android应用中常会出现这样的布局,就是一个listview高度上下顶着屏幕的高度,由于listview是直接从第一个item就开始显示,所以第一个item与屏幕之间就不会有间隔,但是这样是不美观的,我们希望有一定的间距,好说,加个layout_marginTop 不就可以了吗,可是为了在美观 一点还要在屏幕的顶端加个虚化的处理,或者希望这个间距会随着item的滚动而移出屏幕,这样的话layout_marginTop就不能满足要求了。 此时就该用到了addHeaderView()与addFooterView() ,顾名思义:给listview添加一个头一个脚。(header与footer是listview的一部分,所以会随着item的滚动而滚动)

效果图:

android listview addHeaderView和addFooterView_第1张图片

滑动中

android listview addHeaderView和addFooterView_第2张图片

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 );

      }

}
AddFooter.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 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);
...

header为图片:
效果图:
android listview addHeaderView和addFooterView_第3张图片
 
滑动中
android listview addHeaderView和addFooterView_第4张图片

首先新建xml文件:

synteach_header.xml:




    

新建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点击的位置才会正常匹配。


 




你可能感兴趣的:(Android开发)