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