Android 自定义ScrollView ListView 体验各种纵向滑动的需求(1)

*/

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.

  • 15
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值