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>