ScrollView 下拉刷新

分享一款基于scrollview 作为内容区域的下拉刷新代码:

public class ScrollViewUpRefreshLayout extends LinearLayout implements OnTouchListener {

	RelativeLayout header;
	TextView description;
	boolean loadOnce;
	int hideHeaderHeight;
	MarginLayoutParams headerLayoutParams;
	ScrollView webView;
	Context context;
	boolean ableToPull;
	float yDown;
	int touchSlop;
	int PULL =0;
	int RELEASA=1;
	int REFRESHING=2;
	int END=3;
	int currentStatus = END;
	int lastStatus = currentStatus;
	Runnable mListener;
	int pullTime = 200;
	
	

	public ScrollViewUpRefreshLayout(Context context, AttributeSet attrs) {
		super(context, attrs);
		this.context = context;
		touchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
	}

	@Override
	protected void onLayout(boolean changed, int l, int t, int r, int b) {
		super.onLayout(changed, l, t, r, b);

		if (changed && !loadOnce) {
			loadOnce = true;
			header = (RelativeLayout) getChildAt(0);
			description = (TextView)header.getChildAt(0);
			webView = (ScrollView) getChildAt(1);
			webView.setOnTouchListener(this);
			hideHeaderHeight = -header.getHeight();
			headerLayoutParams = (MarginLayoutParams) header.getLayoutParams();
			headerLayoutParams.topMargin = hideHeaderHeight;
			header.setLayoutParams(headerLayoutParams);
		}
	}

	@Override
	public boolean onTouch(View arg0, MotionEvent arg1) {
		setIsAbleToPull(arg1);
		if (ableToPull) {
			switch (arg1.getAction()) {
			case MotionEvent.ACTION_DOWN:
					yDown = arg1.getRawY();
				break;

			case MotionEvent.ACTION_MOVE:
					int distance=(int)(arg1.getRawY()-yDown);
					if (distance<=0 && headerLayoutParams.topMargin <= hideHeaderHeight) {
						return false;
					}
					if (distance<touchSlop) {
						return false;
					}
					if (currentStatus!=REFRESHING) {
						if (headerLayoutParams.topMargin>0) {
							currentStatus = RELEASA;
						}else {
							currentStatus = PULL;
						}
						headerLayoutParams.topMargin = (distance/2)+hideHeaderHeight;
						header.setLayoutParams(headerLayoutParams);
						webView.fullScroll(ScrollView.FOCUS_UP);
					}
				break;

			case MotionEvent.ACTION_UP:
			default:
				if (currentStatus==RELEASA) {
					RefreshingTask();
				}
				if (currentStatus==PULL) {
					HideHeaderTask();
				}
				break;

			}
			
			if (currentStatus==RELEASA|| currentStatus==PULL) {
				updateHeaderView();
				webView.setPressed(false);
				webView.setFocusable(false);
				webView.setFocusableInTouchMode(true);
				lastStatus=currentStatus;
				return true;
			}
		}
		return false;
	}

	private void HideHeaderTask() {
		// TODO Auto-generated method stub
		ValueAnimator valueAnimator=ValueAnimator.ofInt(headerLayoutParams.topMargin, hideHeaderHeight);
		valueAnimator.setDuration(pullTime);
		valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
			
			@Override
			public void onAnimationUpdate(ValueAnimator arg0) {
				// TODO Auto-generated method stub
				int integer=((Integer)arg0.getAnimatedValue()).intValue();
				headerLayoutParams.topMargin = integer;
				header.setLayoutParams(headerLayoutParams);
				webView.fullScroll(ScrollView.FOCUS_UP);
				if (integer==hideHeaderHeight) {
					currentStatus = END;
				}
				updateHeaderView();
			}
		});
		valueAnimator.start();
	}

	private void RefreshingTask() {
		ValueAnimator valueAnimator = ValueAnimator.ofInt(headerLayoutParams.topMargin, 0);
		valueAnimator.setDuration(pullTime);
		valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
			
			@Override
			public void onAnimationUpdate(ValueAnimator arg0) {
				int integer=((Integer)arg0.getAnimatedValue()).intValue();
				headerLayoutParams.topMargin = integer;
				header.setLayoutParams(headerLayoutParams);
				webView.fullScroll(ScrollView.FOCUS_UP);
				if (integer == 0) {
					currentStatus = REFRESHING;
					if (mListener!=null) {
						mListener.run();
					}
				}
				updateHeaderView();
			}
		});
		valueAnimator.start();
		
	}
	
	public void setOnRefreshListener(Runnable pullToRefreshListener){
		mListener = pullToRefreshListener;
	}

	private void updateHeaderView() {
		if (lastStatus!=currentStatus) {
			if (currentStatus==RELEASA) {
				description.setText("放手回到上面");
			}else if (currentStatus==PULL) {
				description.setText("下拉回到上面");
			}else if (currentStatus==REFRESHING) {
				description.setText("正在加载");
			}
		}
	}

	private void setIsAbleToPull(MotionEvent arg1) {
		if (webView.getScrollY()<=0) {//顶部判断
			if (!ableToPull) {
				yDown = arg1.getRawY();
			}
			ableToPull = true;
		} else {
			if (headerLayoutParams.topMargin != hideHeaderHeight) {
				headerLayoutParams.topMargin = hideHeaderHeight;
				header.setLayoutParams(headerLayoutParams);
			}
			ableToPull = false;
		}
	}
	
	public void finishRefreshing(){
		currentStatus = END;
		HideHeaderTask();
	}

	
	

}


使用代码:

<com.example.mydome.ScrollViewUpRefreshLayout
                android:id="@+id/shop_format"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical"
                android:visibility="gone" >

                <RelativeLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:padding="17dp" >

                    <TextView
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:gravity="center"
                        android:text="下拉回到上面" />
                </RelativeLayout>

                <ScrollView
                    android:layout_width="match_parent"
                    android:layout_height="match_parent" >

                    <LinearLayout
                        android:id="@+id/insert_layout"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:orientation="vertical" >

                        <!-- 参数规格 -->

                        <TextView
                            android:layout_width="match_parent"
                            android:layout_height="1000dp"
                            android:background="@android:color/holo_green_dark"
                            android:gravity="center"
                            android:text="@string/action_settings" />
                    </LinearLayout>
                </ScrollView>
            </com.example.mydome.ScrollViewUpRefreshLayout>

java调用:

		scrollViewUpRefreshLayout.setOnRefreshListener(new Runnable() {
			@Override
			public void run() {
				// TODO Auto-generated method stub
				//PrevPage();
				//下来刷新逻辑代码
				
				
				//关闭下拉刷新头
				scrollViewUpRefreshLayout.finishRefreshing();
			}
		});





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值