固定列头的ListView

这篇博客介绍了一个自定义的ScrollListView,它能够实现列头固定的效果。通过定义ListMember类来创建列头,并提供了设置列头颜色、文本等属性的方法。ScrollListView内部包含固定列和可移动列,通过计算宽度和高度来处理滚动效果,允许用户在滚动时保持列头可见。
摘要由CSDN通过智能技术生成
 
1.定义列头member
import java.util.ArrayList;
import java.util.List;

public class ListMember {

	private List<ListMember> lstSub = new ArrayList<ListMember>();
	private int Height = 100;
	private int Width = 50;
	private String Text = "";
	private int Color = android.graphics.Color.rgb(0x90, 0x7e, 0x4b);
	public boolean HaveParent = false;// 有无父级

	public ListMember(String text) {
		this(text, 100);
	}

	public ListMember(String text, int width) {
		this(text, width, 50);
	}

	public ListMember(String text, int width, int height) {
		this(text, width, height, android.graphics.Color.rgb(0x90, 0x7e, 0x4b));
	}

	public ListMember(String text, int width, int height, int color) {
		this.Text = text;
		this.Width = (int) (width * DeviceInfo.getDensity_divisor());
		this.Height = (int) (height * DeviceInfo.getDensity_divisor());
		this.Color = color;
	}

	/**
	 * 添加子元素
	 * 
	 * @param member
	 */
	public ListMember addSubMember(ListMember member) {
		member.HaveParent = false;
		lstSub.add(member);
		return this;
	}

	/**
	 * 获取子元素的个数
	 * 
	 * @return
	 */
	public int getSubSize() {
		return lstSub.size();
	}

	/**
	 * 获取所有的子元素
	 * 
	 * @return
	 */
	public List<ListMember> getSubList() {
		return this.lstSub;
	}

	/**
	 * 获取颜色
	 * 
	 * @return
	 */
	public int getColor() {
		return Color;
	}

	/**
	 * 设置颜色
	 * 
	 * @param color
	 */
	public ListMember setColor(int color) {
		Color = color;
		return this;
	}

	/**
	 * 获取文本
	 * 
	 * @return
	 */
	public String getText() {
		return Text;
	}

	/**
	 * 设置文本
	 * 
	 * @param text
	 */
	public ListMember setText(String text) {
		Text = text;
		return this;
	}

	/**
	 * 获取高度
	 * 
	 * @return
	 */
	public int getHeight() {
		return Height;
	}

	/**
	 * 设置高度
	 * 
	 * @param height
	 */
	public ListMember setHeight(int height) {
		Height = ((Float) (height * DeviceInfo.getDensity_divisor()))
				.intValue();
		return this;
	}

	/**
	 * 获取宽度
	 * 
	 * @return
	 */
	public int getWidth() {
		return Width;
	}

	/**
	 * 设置宽度
	 * 
	 * @param width
	 */
	public ListMember setWidth(int width) {

		float d = DeviceInfo.getDensity_divisor();
		Width = ((Float) (width * d)).intValue();
		return this;
	}
}
2.自定义ScrollListView
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import android.content.Context;
import android.graphics.Color;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.afd.scrolllistview.R.color;

public class ScrollListView extends LinearLayout {
	private Context mContext;
	/** 水平滚动条的高度*/
	private final int iHorizontalScrollViewHeight = 4; 
	/** 框架边缘的宽度*/
	private final int iFrameMarginWidth = 0; 
	/** ListView的高度*/
	private int iScrollListViewHeight = 0; 
	/** 秒数*/
	private int iLongTime = 0; 
	private JSTimerTask timertask = null;
	private Timer timer = null;

	class JSTimerTask extends TimerTask {

		@Override
		public void run() {
			Message message = new Message();
			message.what = 1;
			handler.sendMessage(message);
		}

	}
	/** 列头*/
	private LinearLayout mLayoutHeader;
	/** ListView可移动区域*/
	private LinearLayout mLayoutListMovable;
	/** ListView最大高度*/
	private int listViewMaxHeight=0;
	private ListView listViewMovable;
	private ArrayList<View> mArrayList;
	/** 列头固定布局*/
	private LinearLayout lyFixHead = null;
	/** 列头滑动布局*/
	private LinearLayout lyMovableHead = null;
	/** 列头固定布局与滑动布局间的分隔线*/
	private LinearLayout lySep = null;
	/** 是否有固定列*/
	private boolean bFlag = true;
	/** 固定列的个数*/
	private int FixSize = 1;
	/** 可移动标题的宽度*/
	private int MovableHeadWidth = 0; 
	/** 固定标题的宽度*/
	private int iFixedWidth = 0; 
	/** PWD屏幕宽度*/
	private int iScreenWidth = 0; 
	/** PWD屏幕剩余宽度*/
	private int iScreenSurplusWidth = 0; 
	/** ScrollListView的总宽度(整个标题的宽度和)*/
	private int iScrollListViewWidth = 0; 
	/** 水平滚动条的长度(带两位小数点)*/
	private float fHorizontalScrollView = 0; 
	/** 水平滚动条的长度(不带小数点)*/
	private int iHorizontalScrollView = 0; 
	/** 水平滚动条移动比例(带两位小数点)*/
	private float fRatio = 0; 
	/** 水平滚动条移动比例(不带小数点)*/
	private int iRatio = 0; 
	/** 滚动条滚动的长度*/
	private float fScrollValue = 0; 
	/** ListView需要滑动的宽度(遮挡列的宽度和)*/
	private int iScrollListViewMovableValue = 0; 

	private int iXNew = 0;

	private View vEmpty, vScrollBar;
	private LayoutParams scrollListLpRight;
	private LayoutParams scrollListLpLeft;

	private boolean IsHeadBorder = false;
	private int MoveStyle = 0; // 移动方式,0 到头不在移动, 1 继续移动然后回弹

	public int getMoveStyle() {
		return MoveStyle;
	}

	public void setMoveStyle(int moveStyle) {
		MoveStyle = moveStyle;
	}

	/** 可滚动列头的名称*/
	private List<ListMember> lstMember = null;

	public List<ListMember> getMembers() {
		return lstMember;
	}
	
	/**
	 * 设置ListView的最大高度
	 * 
	 * @param lstMember
	 */
	public void setListViewMaxHeight(int height) {
		this.listViewMaxHeight = height;
	}

	/**
	 * 设置数据
	 * 
	 * @param lstMember
	 */
	public void setMembers(List<ListMember> lstMember) {
		setMembers(lstMember, -1);
	}

	/**
	 * 设置数据
	 * 
	 * @param lstMember
	 * @param fixSize 固定列的个数
	 */
	public void setMembers(List<ListMember> lstMember, int fixSize) {
		this.lstMember = lstMember;
		if (fixSize > 0) {
			this.FixSize = fixSize;
		}
		if (fixSize == 0) {
			bFlag = false;
		}
		if (this.lstMember != null) {
			this.buildHead();
		}

	}

	public ScrollListView(Context context) {
		super(context);
		mContext = context;
	}

	public ScrollListView(Context context, AttributeSet attrs) {
		super(context, attrs);
		mContext = context;

		// ListView可移动区域
		mLayoutListMovable = new LinearLayout(mContext);
		mLayoutListMovable.setOrientation(LinearLayout.VERTICAL);
		LayoutParams scrollListLp = new LayoutParams(LayoutParams.MATCH_PARENT,
				LayoutParams.MATCH_PARENT);
		this.addView(buidScrollListView(), scrollListLp);
	}

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
	}

	/**
	 * 构建整个ScrollListView
	 * 
	 * @return
	 */
	private View buidScrollListView() {
		//1.构建父布局
		RelativeLayout rl = new RelativeLayout(mContext);
		//2.添加子布局(头和listView)
		LinearLayout llAll = new LinearLayout(mContext);
		llAll.setOrientation(LinearLayout.VERTICAL);
		llAll.addView(buildHeadLayout());// 加头
		llAll.addView(buildMoveableListView());// 构建整个listView
		llAll.setPadding(0, 0, 0, iHorizontalScrollViewHeight);
		llAll.setId(1);

		RelativeLayout.LayoutParams lp1 = new RelativeLayout.LayoutParams(
				ViewGroup.LayoutParams.MATCH_PARENT,
				ViewGroup.LayoutParams.WRAP_CONTENT);
		lp1.addRule(RelativeLayout.ALIGN_PARENT_TOP);
		rl.addView(llAll, lp1);// 加头
		//3.添加滚动条
		View vScrollBar = buildScrollBar();
		RelativeLayout.LayoutParams lp2 = new RelativeLayout.LayoutParams(
				ViewGroup.LayoutParams.MATCH_PARENT,
				ViewGroup.LayoutParams.WRAP_CONTENT);
		lp2.addRule(RelativeLayout.ALIGN_BOTTOM, 1);
		lp2.setMargins(0, 0, 0, 3);
		rl.addView(vScrollBar, lp2);// 构建整个listView

		return rl;
	}

	/**
	 * 合并列头
	 * @return
	 */
	private View buildHeadLayout() {
		LinearLayout ll = new LinearLayout(mContext);

		lyFixHead = new LinearLayout(mContext);
		lyFixHead.setBackgroundColor(Color.GRAY);
		lyMovableHead = new LinearLayout(mContext);
		lyMovableHead.setBackgroundColor(Color.GRAY);
		lySep = new LinearLayout(mContext);

		ll.addView(lyFixHead);
		ll.addView(lySep);
		ll.addView(lyMovableHead);

		buildHead();// 生成标题数据
		mLayoutHeader = ll;
		return ll;
	}

	/**
	 * 生成标题数据
	 */
	private void buildHead() {
		iFixedWidth = 0; // 固定标题的宽度
		iScreenWidth = 0; // PWD屏幕宽度
		iScreenSurplusWidth = 0; // PWD屏幕剩余宽度
		iScrollListViewWidth = 0; // ScrollListView的总宽度(整个标题的宽度和)
		fHorizontalScrollView = 0; // 水平滚动条的长度(带两位小数点)
		iHorizontalScrollView = 0; // 水平滚动条的长度(不带小数点)
		fRatio = 0; // 水平滚动条移动比例(带两位小数点)
		iRatio = 0; // 水平滚动条移动比例(不带小数点)
		fScrollValue = 0; // 滚动条滚动的长度
		iScrollListViewMovableValue = 0; // Listview需要滑动的宽度(遮挡列的宽度和)
		iXNew = 0;
		iScro
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值