今天研究了一下可拖拽的ListView ,当ListView的数据不能充满整个模拟器的时候,系统自带的listview上拖下拽都不好使,显得很单调,
为了实现上拖下拽时也能实现滚动的效果,这时候就需要自定义ListView ,继承系统的ListView。
下面贴上自定义的ListView 。
package com.xiang.widget; import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.widget.ListView; public class DenifyMyListView extends ListView implements Runnable { private float mFirstDownY=0f; private int mDistance=0; private int mStep=0; private boolean mpostive=false; public DenifyMyListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public DenifyMyListView(Context context, AttributeSet attrs) { super(context, attrs); } public DenifyMyListView(Context context) { super(context); } @Override public boolean onTouchEvent(MotionEvent ev) { // TODO Auto-generated method stub switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: if(mFirstDownY == 0f && mDistance == 0) { mFirstDownY=ev.getY(); return true;//将事件消耗掉 } break; case MotionEvent.ACTION_CANCEL: break; case MotionEvent.ACTION_UP: if(mDistance!=0) { mStep=1; mpostive = ( mDistance > 0); this.post(this); return true; } mDistance=0; mFirstDownY=0; break; case MotionEvent.ACTION_MOVE: /* * 若 第一次按下的Y坐标不为0,并且移动时产生不为0的距离,就产生滑动距离一半的空白ListView, * 显示到页面上,若按下坐标为0即相当于没有按下,没有按下滑动自然不会产生。距离还是初始值0 */ if(mFirstDownY != 0f) { mDistance=(int) (mFirstDownY-ev.getY()); if ((mDistance < 0 && getFirstVisiblePosition() == 0 && getChildAt(0).getTop() == 0) || (mDistance > 0 && getLastVisiblePosition() == getCount() - 1)) { mDistance /= 2; scrollTo(0, mDistance); return true;//同样的,消耗掉这一触摸事件 } } mDistance=0; break; default: break; } return super.onTouchEvent(ev); } @Override public void run() { mDistance += ( mDistance > 0 ? -mStep : mStep); scrollTo(0, mDistance); if((mDistance >=0 && !mpostive)||( mpostive && mDistance <= 0)) { scrollTo(0, 0); mDistance=0; mFirstDownY=0; return; } mStep += 1; this.postDelayed(this, 10); } }