自定义下拉刷新组件
原创
©著作权归作者所有:来自51CTO博客作者mb61b711907d5f4的原创作品,请联系作者获取转载授权,否则将追究法律责任
package com.example.customclass;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.ScrollView;
import android.widget.Scroller;
import com.example.test.R;
* Created by LI on 2016/1/5.
public class RefershLinearLayout extends LinearLayout {
FreshListener freshListener;
refreshing,normal,pulldown
public RefershLinearLayout(Context context) {
public RefershLinearLayout(Context context, AttributeSet attrs) {
scroller = new Scroller(mContext);
header = LayoutInflater.from(mContext).inflate(R.layout.header,null);
bar = (ProgressBar) header.findViewById(R.id.bar);
direction = (ImageView) header.findViewById(R.id.direction);
headerHeightPix = (int) (50*mContext.getResources().getDisplayMetrics().density);
LayoutParams params = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,headerHeightPix);
params.topMargin = (0-headerHeightPix);
public boolean onInterceptTouchEvent(MotionEvent ev) {
int y= (int) ev.getRawY();
Log.i("LIJILONG", "onInterceptTouchEvent()");
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
if(m>=2.0 &&canScroll()) {
Log.i("LIJILONG" ,"canScroll() true");
public boolean onTouchEvent(MotionEvent event) {
Log.i("lijilong", "onTouchEvent status = "+status);
int y = (int) event.getRawY();
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
case MotionEvent.ACTION_UP:
LayoutParams params = (LayoutParams) header.getLayoutParams();
int marginTop = params.topMargin;
bar.setVisibility(View.VISIBLE);
direction.setVisibility(View.GONE);
scroller.startScroll(0, marginTop, 0, 0 - marginTop);
// header.setLayoutParams(params);
if(freshListener !=null){
scroller.startScroll(0, marginTop, 0 ,0-(headerHeightPix+marginTop));
public void finishFresh(){
bar.setVisibility(View.GONE);
scroller.startScroll(0, 0, 0, (0 - headerHeightPix));
// LayoutParams params = (LayoutParams) header.getLayoutParams();
// int marginTop = params.topMargin;
// params.topMargin = (0-headerHeightPix);
// header.setLayoutParams(params);
private void moveLayout(int m) {
Log.i("lijilong","moveLayout");
LayoutParams params = (LayoutParams) header.getLayoutParams();
int margintop = params.topMargin;
direction.setVisibility(View.VISIBLE);
bar.setVisibility(View.GONE);
direction.setImageResource(R.drawable.refresh_arrow_up);
direction.setImageResource(R.drawable.refresh_arrow_down);
int position_y = (int) (margintop + m*0.3);
params.topMargin = position_y;
header.setLayoutParams(params);
public void computeScroll() {
if (scroller.computeScrollOffset()) {//scroll 动作还未结束
int i = this.scroller.getCurrY();
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) this.header
int k = Math.max(i, (0-headerHeightPix));
this.header.setLayoutParams(lp);
private boolean canScroll() {
// TODO Auto-generated method stub
if (getChildCount() > 1) {
Log.e("lijilong","getChildCount="+getChildCount());
for(int i=0;i<getChildCount();i++){
Log.e("lijilong",getChildAt(i).toString());
childView = this.getChildAt(1);
if (childView instanceof ListView) {
int top = ((ListView) childView).getChildAt(0).getTop();
int pad = ((ListView) childView).getListPaddingTop();
if ((Math.abs(top - pad)) < 3
&& ((ListView) childView).getFirstVisiblePosition() == 0) {
} else if (childView instanceof ScrollView) {
if (((ScrollView) childView).getScrollY() == 0) {
Log.i("LIJILONG","canScroll false");
public void setListener(FreshListener listener){
freshListener = listener;
public interface FreshListener{