欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Activity实现下拉刷新

程序员文章站 2022-06-04 15:51:14
...

一般的下拉刷新都只实现了刷新ListView,本demo实现了刷新普通Activity

RefreshScrollActivity.java:

 

package com.nono.refreshDemo;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.Toast;

/**
 * 
 * @author Nono
 *
 */
public class RefreshScrollActivity extends Activity implements
RefreshableView.RefreshListener {
    /** Called when the activity is first created. */
	private RefreshableView mRefreshableView;
	private Context mContext;
	
	
	Handler handler = new Handler() {
		public void handleMessage(Message message) {
			super.handleMessage(message);
			mRefreshableView.finishRefresh();
			Toast.makeText(mContext, R.string.toast_text, Toast.LENGTH_SHORT).show();
		};
	};
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mContext = this;
        init();
    }
	private void init() {
		// TODO Auto-generated method stub
		initView();
	}
	private void initView() {
		// TODO Auto-generated method stub
		mRefreshableView = (RefreshableView) findViewById(R.id.refresh_root);
		initData();
	}
	private void initData() {
		mRefreshableView.setRefreshListener(this);
		
	}
	
	//实现刷新RefreshListener 中方法
	public void onRefresh(RefreshableView view) {
		//伪处理
		handler.sendEmptyMessageDelayed(1, 2000);
		
	}
}

 

 

 

 

 

RefreshableView.java:

 

package com.nono.refreshDemo;


import java.util.Calendar;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
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 android.widget.TextView;


/**
 * 刷新控制view
 * 
 * @author Nono
 * 
 */
public class RefreshableView extends LinearLayout {

    private static final String TAG = "LILITH";
    private Scroller scroller;
    private View refreshView;
    private ImageView refreshIndicatorView;
    private int refreshTargetTop = -60;
    private ProgressBar bar;
    private TextView downTextView;
    private TextView timeTextView;
    private LinearLayout reFreshTimeLayout;//显示上次刷新时间的layout
    private RefreshListener refreshListener;

    private String downTextString;
    private String releaseTextString;

 //   private Long refreshTime = null;
    private int lastX;
    private int lastY;
    // 拉动标记
    private boolean isDragging = false;
    // 是否可刷新标记
    private boolean isRefreshEnabled = true;
    // 在刷新中标记
    private boolean isRefreshing = false;
    Calendar LastRefreshTime;
    
    private Context mContext;
    public RefreshableView(Context context) {
        super(context);
        mContext = context;
        
    }
    public RefreshableView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
        init();
        
    }
    private void init() {
        // TODO Auto-generated method stub
        //滑动对象,
        LastRefreshTime=Calendar.getInstance();
        scroller = new Scroller(mContext);
        
        //刷新视图顶端的的view
         refreshView = LayoutInflater.from(mContext).inflate(R.layout.refresh_top_item, null);
        //指示器view
         refreshIndicatorView = (ImageView) refreshView.findViewById(R.id.indicator);
        //刷新bar
        bar = (ProgressBar) refreshView.findViewById(R.id.progress);
        //下拉显示text
         downTextView = (TextView) refreshView.findViewById(R.id.refresh_hint);
        //下来显示时间
         timeTextView = (TextView) refreshView.findViewById(R.id.refresh_time);
         reFreshTimeLayout=(LinearLayout)refreshView.findViewById(R.id.refresh_time_layout);
         
        LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, -refreshTargetTop);
        lp.topMargin = refreshTargetTop;
        lp.gravity = Gravity.CENTER;
        addView(refreshView, lp);
        downTextString = mContext.getResources().getString(R.string.refresh_down_text);
        releaseTextString = mContext.getResources().getString(R.string.refresh_release_text);   
    }




    /**
     * 设置上次刷新时间
     * @param time
     */
    private void setLastRefreshTimeText() {
        // TODO Auto-generated method stub
        reFreshTimeLayout.setVisibility(View.VISIBLE);
        Calendar NowTime=Calendar.getInstance();
        long l=NowTime.getTimeInMillis()-LastRefreshTime.getTimeInMillis();
        int days=new Long(l/(1000*60*60*24)).intValue();
        int hour=new Long(l/(1000*60*60)).intValue();
        int min=new Long(l/(1000*60)).intValue();
        if(days!=0)
        {
            timeTextView.setText(days+"天"); 
        }
        else  if(hour!=0)
        {
            timeTextView.setText(hour+"小时"); 
        }
        else if(min!=0)
        {
            timeTextView.setText(min+"分钟"); 
        }
       
         
        //timeTextView.setText(time);
    }


    
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        
        int y= (int) event.getRawY();
        
        
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            //记录下y坐标
            lastY = y;
            break;

        case MotionEvent.ACTION_MOVE:
            Log.i(TAG, "ACTION_MOVE");
            //y移动坐标
            int m = y - lastY;
            if(((m < 6) && (m > -1)) || (!isDragging )){
                setLastRefreshTimeText();
                 doMovement(m);
            }
            //记录下此刻y坐标
            this.lastY = y;
            break;
            
        case MotionEvent.ACTION_UP:
            Log.i(TAG, "ACTION_UP");
            
            fling();
            
            break;
        }
        return true;
    }


    /**
     * up事件处理
     */
    private void fling() {
        // TODO Auto-generated method stub
        LinearLayout.LayoutParams lp = (LayoutParams) refreshView.getLayoutParams();
        Log.i(TAG, "fling()" + lp.topMargin);
        if(lp.topMargin > 0){//拉到了触发可刷新事件
            refresh();  
        }else{
            returnInitState();
        }
    }
    

    
    private void returnInitState() {
        // TODO Auto-generated method stub
         LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)this.refreshView.getLayoutParams();
         int i = lp.topMargin;
         scroller.startScroll(0, i, 0, refreshTargetTop);
         invalidate();
    }
    private void refresh() {
        // TODO Auto-generated method stub
         LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)this.refreshView.getLayoutParams();
         int i = lp.topMargin;
         reFreshTimeLayout.setVisibility(View.GONE);
         refreshIndicatorView.setVisibility(View.GONE);
         bar.setVisibility(View.VISIBLE);
         timeTextView.setVisibility(View.GONE);
         downTextView.setVisibility(View.GONE);
         scroller.startScroll(0, i, 0, 0-i);
         invalidate();
         if(refreshListener !=null){
             refreshListener.onRefresh(this);
             isRefreshing = true;
         }
    }
    
    /**
     * 
     */
    @Override
    public void computeScroll() {
        // TODO Auto-generated method stub
        if(scroller.computeScrollOffset()){
            int i = this.scroller.getCurrY();
              LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)this.refreshView.getLayoutParams();
              int k = Math.max(i, refreshTargetTop);
              lp.topMargin = k;
              this.refreshView.setLayoutParams(lp);
              this.refreshView.invalidate();
              invalidate();
        }
    }
    /**
     * 下拉move事件处理
     * @param moveY
     */
    private void doMovement(int moveY) {
        // TODO Auto-generated method stub
        LinearLayout.LayoutParams lp = (LayoutParams) refreshView.getLayoutParams();
        if(moveY>0){
            //获取view的上边距
            float f1 =lp.topMargin;
            float f2 = moveY * 0.3F;
            int i = (int)(f1+f2);
            //修改上边距
            lp.topMargin = i;
            //修改后刷新
            refreshView.setLayoutParams(lp);
            refreshView.invalidate();
            invalidate();
        }
        else 
        {
            float f1 =lp.topMargin;
            int i=(int)(f1+moveY*0.9F);
            Log.i("aa", String.valueOf(i));
            if(i>=refreshTargetTop)
            {
                lp.topMargin = i;
                //修改后刷新
                refreshView.setLayoutParams(lp);
                refreshView.invalidate();
                invalidate();
            }
            else 
            {
                
            }
        }
        
        timeTextView.setVisibility(View.VISIBLE);
//        if(refreshTime!= null){
//            setRefreshTime(refreshTime);
//        }
        downTextView.setVisibility(View.VISIBLE);
        
        refreshIndicatorView.setVisibility(View.VISIBLE);
        bar.setVisibility(View.GONE);
        if(lp.topMargin >  0){
            downTextView.setText(R.string.refresh_release_text);
            refreshIndicatorView.setImageResource(R.drawable.refresh_arrow_up);
        }else{
            downTextView.setText(R.string.refresh_down_text);
            refreshIndicatorView.setImageResource(R.drawable.refresh_arrow_down);
        }
            
    }

    public void setRefreshEnabled(boolean b) {
        this.isRefreshEnabled = b;
    }

    public void setRefreshListener(RefreshListener listener) {
        this.refreshListener = listener;
    }


    /**
     * 结束刷新事件
     */
    public void finishRefresh(){
        Log.i(TAG, "执行了=====finishRefresh");
         LinearLayout.LayoutParams lp= (LinearLayout.LayoutParams)this.refreshView.getLayoutParams();
            int i = lp.topMargin;
            refreshIndicatorView.setVisibility(View.VISIBLE);
            timeTextView.setVisibility(View.VISIBLE);
            scroller.startScroll(0, i, 0, refreshTargetTop);
            invalidate();
            isRefreshing = false;  
            LastRefreshTime=Calendar.getInstance();
    }

    
    /*该方法一般和ontouchEvent 一起用
     * (non-Javadoc)
     * @see android.view.ViewGroup#onInterceptTouchEvent(android.view.MotionEvent)
     */
    @Override
    public boolean onInterceptTouchEvent(MotionEvent e) {
        // TODO Auto-generated method stub
        int action = e.getAction();
        int y= (int) e.getRawY();
        switch (action) {
        case MotionEvent.ACTION_DOWN:
            lastY = y;
            break;

        case MotionEvent.ACTION_MOVE:
            //y移动坐标
            int m = y - lastY;

            //记录下此刻y坐标
            this.lastY = y;
             if(m > 6 &&  canScroll()){
                 return true;
             }
            break;
        case MotionEvent.ACTION_UP:
            
            break;
            
    case MotionEvent.ACTION_CANCEL:
            
            break;
        }
        return false;
    }
    private boolean canScroll() {
        // TODO Auto-generated method stub
        View childView;
        if(getChildCount()>1){
            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){
                    return true;
                }else{
                    return false;
                }
            }else if(childView instanceof ScrollView){
                if(((ScrollView)childView).getScrollY() == 0){
                    return true;
                }else{
                    return false;
                }
            }
            
        }
        return false;
    }
    /**
     * 刷新监听接口
     * @author Nono
     *
     */
    public interface RefreshListener{
        public void onRefresh(RefreshableView view);
    }


}

 

 

 

 

 

main.xml:

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/app_bg"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dip"
        android:gravity="center"
        android:text="@string/hello"
        android:textColor="@color/black" />

    <com.nono.refreshDemo.RefreshableView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/refresh_root"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <ScrollView
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/scroll_view_root"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" >

            <LinearLayout
                android:id="@+id/linear_root"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:gravity="center"
                android:orientation="vertical" >

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="fill_parent"
                    android:background="@drawable/item_bg"
                    android:gravity="center"
                    android:text="第一行哈哈哈哈哈哈"
                    android:textColor="@color/black"
                    android:textSize="30sp" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="fill_parent"
                    android:background="@drawable/item_bg"
                    android:gravity="center"
                    android:text="第二行哈哈哈哈哈哈"
                    android:textColor="@color/black"
                    android:textSize="30sp" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="fill_parent"
                    android:background="@drawable/item_bg"
                    android:gravity="center"
                    android:text="第三行哈哈哈哈哈哈"
                    android:textColor="@color/black"
                    android:textSize="30sp" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="fill_parent"
                    android:background="@drawable/item_bg"
                    android:gravity="center"
                    android:text="第四行哈哈哈哈哈哈"
                    android:textColor="@color/black"
                    android:textSize="30sp" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="fill_parent"
                    android:background="@drawable/item_bg"
                    android:gravity="center"
                    android:text="第五行哈哈哈哈哈哈"
                    android:textColor="@color/black"
                    android:textSize="30sp" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="fill_parent"
                    android:background="@drawable/item_bg"
                    android:gravity="center"
                    android:text="第六行哈哈哈哈哈哈"
                    android:textColor="@color/black"
                    android:textSize="30sp" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="fill_parent"
                    android:background="@drawable/item_bg"
                    android:gravity="center"
                    android:text="第七行哈哈哈哈哈哈"
                    android:textColor="@color/black"
                    android:textSize="30sp" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="fill_parent"
                    android:background="@drawable/item_bg"
                    android:gravity="center"
                    android:text="第八行哈哈哈哈哈哈"
                    android:textColor="@color/black"
                    android:textSize="30sp" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="fill_parent"
                    android:background="@drawable/item_bg"
                    android:gravity="center"
                    android:text="第九行哈哈哈哈哈哈"
                    android:textColor="@color/black"
                    android:textSize="30sp" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="fill_parent"
                    android:background="@drawable/item_bg"
                    android:gravity="center"
                    android:text="第十行哈哈哈哈哈哈"
                    android:textColor="@color/black"
                    android:textSize="30sp" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="fill_parent"
                    android:background="@drawable/item_bg"
                    android:gravity="center"
                    android:text="第十行哈哈哈哈哈哈"
                    android:textColor="@color/black"
                    android:textSize="30sp" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="fill_parent"
                    android:background="@drawable/item_bg"
                    android:gravity="center"
                    android:text="第十行哈哈哈哈哈哈"
                    android:textColor="@color/black"
                    android:textSize="30sp" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="fill_parent"
                    android:background="@drawable/item_bg"
                    android:gravity="center"
                    android:text="第十行哈哈哈哈哈哈"
                    android:textColor="@color/black"
                    android:textSize="30sp" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="fill_parent"
                    android:background="@drawable/item_bg"
                    android:gravity="center"
                    android:text="第十行哈哈哈哈哈哈"
                    android:textColor="@color/black"
                    android:textSize="30sp" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="fill_parent"
                    android:background="@drawable/item_bg"
                    android:gravity="center"
                    android:text="第十行哈哈哈哈哈哈"
                    android:textColor="@color/black"
                    android:textSize="30sp" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="fill_parent"
                    android:background="@drawable/item_bg"
                    android:gravity="center"
                    android:text="第十行哈哈哈哈哈哈"
                    android:textColor="@color/black"
                    android:textSize="30sp" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="fill_parent"
                    android:background="@drawable/item_bg"
                    android:gravity="center"
                    android:text="第十行哈哈哈哈哈哈"
                    android:textColor="@color/black"
                    android:textSize="30sp" />
            </LinearLayout>
        </ScrollView>
    </com.nono.refreshDemo.RefreshableView>

</LinearLayout>

 

 

 

 

 

refresh_top_item.xml:

 

<?xml version="1.0" encoding="utf-8"?>
<!-- android:layout_marginTop="-50.0dip"隐藏 -->
<LinearLayout android:orientation="vertical"
	android:layout_width="fill_parent" android:layout_height="50.0dip"
	android:layout_marginTop="-50.0dip" xmlns:android="http://schemas.android.com/apk/res/android">

	<RelativeLayout
	    android:layout_width="fill_parent"
	    android:layout_height="fill_parent" >

		<ImageView
		    android:id="@+id/indicator"
		    android:layout_width="wrap_content"
		    android:layout_height="wrap_content"
		    android:layout_centerVertical="true"
		    android:layout_marginLeft="20dp"
		    android:src="@drawable/refresh_arrow_down" />

		<LinearLayout
		    android:layout_width="fill_parent"
		    android:layout_height="fill_parent"
		    android:layout_centerInParent="true"
		    android:gravity="center"
		    android:orientation="vertical" >

		    <LinearLayout
		        android:layout_width="fill_parent"
		        android:layout_height="wrap_content"
		        android:gravity="center"
		        android:orientation="horizontal" >

		        <ProgressBar
		            android:id="@+id/progress"
		            style="?android:attr/progressBarStyleSmall"
		            android:layout_width="wrap_content"
		            android:layout_height="wrap_content"
		            android:indeterminateBehavior="repeat"
		            android:max="10000"
		            android:visibility="gone" />

		        <TextView
		            android:id="@+id/refresh_hint"
		            android:layout_width="wrap_content"
		            android:layout_height="wrap_content"
		            android:layout_marginLeft="5.0dip"
		            android:gravity="center_vertical"
		            android:text="松开手指刷新"
		            android:textSize="14.0sp" />
		    </LinearLayout>

		    <LinearLayout
		        android:id="@+id/refresh_time_layout"
		        android:layout_width="wrap_content"
		        android:layout_height="wrap_content"
		        android:layout_marginBottom="5dp"
		        android:layout_marginTop="3dp" >

		        <TextView
		            android:id="@+id/textView1"
		            android:layout_width="wrap_content"
		            android:layout_height="wrap_content"
		            android:gravity="center_vertical"
		            android:text="上次刷新时间:"
		            android:textSize="10sp" />

		        <TextView
		            android:id="@+id/refresh_time"
		            android:layout_width="wrap_content"
		            android:layout_height="wrap_content"
		            android:text="0分钟"
		            android:textSize="10sp" />

		        <TextView
		            android:id="@+id/textView2"
		            android:layout_width="wrap_content"
		            android:layout_height="wrap_content"
		            android:text="前"
		            android:textSize="10sp" />
		    </LinearLayout>
		</LinearLayout>

		<View
		    android:layout_width="fill_parent"
		    android:layout_height="5dp"
		    android:layout_alignParentBottom="true"
		    android:background="#ffc8b67a" />

	</RelativeLayout>

</LinearLayout>