android下拉刷新
16lz
2021-01-23
下拉刷新
package com.lcj.demo1.view;import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.view.View;import android.widget.AbsListView;import android.widget.ImageView;import android.widget.ListView;import android.widget.ProgressBar;import android.widget.TextView;import com.lcj.demo1.R;import java.text.SimpleDateFormat;import java.util.Date;public class PullToRefreshListView extends ListView implements AbsListView.OnScrollListener { private View headerView; private View footerView; private ImageView iv; private ProgressBar pb; private int headerViewHeight; private TextView tv; private TextView tvTime; private OnRefreshListener mListener; int startY = -1; private static final int PULL_STATE = 0; // 下拉状态 private static final int RELEASE_STATE = 1; // 松开状态 private static final int REFRESHING_STATE = 2; // 刷新状态 private int mCurrentState = PULL_STATE; // 当前状态 private int footerViewHeight; public PullToRefreshListView(Context context) { super(context); initHeadView(); initFootView(); } public PullToRefreshListView(Context context, AttributeSet attrs) { super(context, attrs); initHeadView(); initFootView(); } public PullToRefreshListView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initHeadView(); initFootView(); } private void initHeadView() { headerView = View.inflate(getContext(), R.layout.header_listview, null); iv = (ImageView) headerView.findViewById(R.id.iv); pb = (ProgressBar) headerView.findViewById(R.id.pb); tv = (TextView) headerView.findViewById(R.id.tv_desc); tvTime = (TextView) headerView.findViewById(R.id.tv_time); addHeaderView(headerView); headerView.measure(0, 0); headerViewHeight = headerView.getMeasuredHeight(); this.setPadding(0, -headerViewHeight, 0, 0); tvTime.setText("上次刷新时间:" + getCurrentTime()); } private void initFootView() { footerView = View.inflate(getContext(), R.layout.footer_listview, null); addFooterView(footerView); footerView.measure(0, 0); footerViewHeight = footerView.getMeasuredHeight(); footerView.setPadding(0, -footerViewHeight, 0, 0); this.setOnScrollListener(this); } @Override public boolean onTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: startY = (int) ev.getRawY(); break; case MotionEvent.ACTION_MOVE: if (startY == -1) { startY = (int) ev.getRawY(); } if (mCurrentState == REFRESHING_STATE) { break; } int endY = (int) ev.getRawY(); int dy = endY - startY; if (dy > 0 && getFirstVisiblePosition() == 0) { int diff = dy - headerViewHeight; this.setPadding(0, diff, 0, 0); if (diff > 0 && mCurrentState != RELEASE_STATE) { mCurrentState = RELEASE_STATE; refreshState(); } else if (diff <= 0 && mCurrentState != PULL_STATE) { mCurrentState = PULL_STATE; refreshState(); } } break; case MotionEvent.ACTION_UP: startY = -1; if (mCurrentState == PULL_STATE) { this.setPadding(0, -headerViewHeight, 0, 0); } else if (mCurrentState == RELEASE_STATE) { mCurrentState = REFRESHING_STATE; refreshState(); this.setPadding(0, 0, 0, 0); } break; default: break; } return super.onTouchEvent(ev); } private void refreshState() { switch (mCurrentState) { case PULL_STATE: tv.setText("下拉刷新"); iv.setVisibility(View.VISIBLE); pb.setVisibility(View.INVISIBLE); break; case RELEASE_STATE: tv.setText("松开刷新"); iv.setVisibility(View.VISIBLE); pb.setVisibility(View.INVISIBLE); break; case REFRESHING_STATE: tv.setText("正在刷新"); iv.setVisibility(View.INVISIBLE); pb.setVisibility(View.VISIBLE); if (mListener != null) { mListener.onRefresh(); } break; default: break; } } public void setOnRefreshListener(OnRefreshListener listener) { this.mListener = listener; } public interface OnRefreshListener { public void onRefresh(); // 下拉刷新 public void onLoadMore(); // 加载更多 } private boolean isLoadMore; @Override public void onScrollStateChanged(AbsListView view, int scrollState) { if (scrollState == SCROLL_STATE_IDLE || scrollState == SCROLL_STATE_FLING) { if (getLastVisiblePosition() == getCount() - 1 && !isLoadMore) { // 到达了最后一条 footerView.setPadding(0, 0, 0, 0); setSelection(getCount() - 1); Log.d(PullToRefreshListView.class.getName(), "onScrollStateChanged: " + getCount()); isLoadMore = true; if (mListener != null) { mListener.onLoadMore(); } } } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { } /** * 刷新完成 */ public void onRefreshCompleted() { if (isLoadMore) { footerView.setPadding(0, -footerViewHeight, 0, 0); isLoadMore = false; } else { mCurrentState = PULL_STATE; tv.setText("下拉刷新"); iv.setVisibility(View.VISIBLE); pb.setVisibility(View.INVISIBLE); this.setPadding(0, -headerViewHeight, 0, 0); tvTime.setText("上次刷新时间:" + getCurrentTime()); } } private String getCurrentTime() { SimpleDateFormat format = new SimpleDateFormat("yy-MM-dd HH:mm:ss"); return format.format(new Date()); }}
更多相关文章
- android java获取当前时间的总结
- Android 图片加载缓存
- 网络时间同步
- android 状态栏移动到底部
- 关于标准android中视频播放器中的快进和快退的步长时间设置
- 修改应用按键无响应的时间
- Android 如何加载大图片
- Android 图片加载库Glide
- Android 如何调用MediaPlayer播放视频[状态机]【图】