android listview addHeaderView和addFooterView

在Android应用中,为了使ListView与屏幕间有美观的间距和动态效果,可以使用addHeaderView()和addFooterView()方法。这两个方法允许在ListView的顶部添加Header并底部添加Footer,它们会随列表项滚动。当设置监听器时,记得调整position以排除自定义的Header数量,以确保正确匹配ListView的item位置。
摘要由CSDN通过智能技术生成

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

      }

}

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为图片:
效果图:
 
滑动中


首先新建xml文件:

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


 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值