*/
public static abstract class Adapter
{
public abstract View getView(SingleItemScrollView parent, int pos);
public abstract int getCount();
}
构造方法中得到屏幕的高度
public SingleItemScrollView(Context context, AttributeSet attrs)
{
super(context, attrs);
// 计算屏幕的高度
WindowManager wm = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics outMetrics = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(outMetrics);
mScreenHeight = outMetrics.heightPixels;
mScreenHeight -= getStatusHeight(context);
}
onMeasure中对Item进行添加,以及设置高度
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
//防止多次调用
if (!flag)
{
mContainer = (ViewGroup) getChildAt(0);
//根据Adapter的方法,为容器添加Item
if (mAdapter != null)
{
mItemCount = mAdapter.getCount();
mItemHeight = mScreenHeight / mItemCount;
mContainer.removeAllViews();
for (int i = 0; i < mAdapter.getCount(); i++)
{
addChildView(i);
}
}
addChildView(0);
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
/**
-
在容器末尾添加一个Item
-
@param i
*/
private void addChildView(int i)
{
View item = mAdapter.getView(this, i);
//设置参数
android.view.ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(
android.view.ViewGroup.LayoutParams.MATCH_PARENT, mItemHeight);
item.setLayoutParams(lp);
//设置Tag
item.setTag(i);
//添加事件
item.setOnClickListener(this);
mContainer.addView(item);
}
接下来就是复写onTouchEvent
@Override
public boolean onTouchEvent(MotionEvent ev)
{
flag = true;
int action = ev.getAction();
int scrollY = getScrollY();
switch (action)
{
case MotionEvent.ACTION_MOVE:
Log.e(“TAG”, "scrollY = " + scrollY);
// 表示此时ScrollView的顶部已经达到屏幕顶部
if (scrollY == 0)
{
addChildToFirst();
}
// ScrollView的顶部已经到达屏幕底部
if (Math.abs(scrollY - mItemHeight) <= mItemCount)
{
addChildToLast();
}
break;
case MotionEvent.ACTION_UP:
checkForReset();
return true;
default:
break;
}
return super.onTouchEvent(ev);
}
/**
- 在底部添加一个View,并移除第一个View
*/
private void addChildToLast()
{
Log.e(“TAG”, “addChildToLast”);
int pos = (Integer) mContainer.getChildAt(1).getTag();
addChildView(pos);
mContainer.removeViewAt(0);
this.