@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:downY = (int) event.getY();break;case MotionEvent.ACTION_MOVE:moveY = (int) event.getY();diffY = moveY - downY;//滑动的距离paddY = - heightHeader + diffY / 3;viewHeader.setPadding(0, paddY, 0, 0);return true;//break;case MotionEvent.ACTION_UP:break;}return false;}
【自定义ListView下拉刷新上拉加载更多】我们下面要做下拉时给人的反馈,我们下拉时有3种状态分别是
- 开始刷新 (下拉距离不超过100)
- 释放刷新 (下拉距离超过100)
- 刷新中 (手指释放,up事件处理)

文章插图
//属性-开始刷新状态private final int PULL_REFRESH_STATE = 0;private final int PULL_REFRESH_RELEASE = 1;//释放刷新private final int PULL_REFRESHING = 2;//正在刷新private int pull_current_state = PULL_REFRESH_STATE;//当前状态
public void updateHeaderState() {switch (pull_current_state) {//开始case PULL_REFRESH_STATE:header_text.setText("开始刷新");viewHeader.setPadding(0, -heightHeader, 0, 0);break;//释放case PULL_REFRESH_RELEASE:header_text.setText("释放刷新");break;//正在case PULL_REFRESHING:header_text.setText("刷新中.......");viewHeader.setPadding(0, 0, 0, 0);break;}}
我们只需要判断是否处于刷新中,如果不是,则计算是不是第一个item可见并且滑动距离大于0,证明手指滑动了 。然后不同滑出高度显示不同的文字即可 。@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:downY = (int) event.getY();break;case MotionEvent.ACTION_MOVE:moveY = (int) event.getY();diffY = moveY - downY;//滑动的距离paddY = - heightHeader + diffY / 3;//如果是正在刷新中不做任何操作if (pull_current_state == PULL_REFRESHING) {return false;}//下拉//第一条,并且滑动距离大于0if (getFirstVisiblePosition() == 0 && diffY > 0) {if (paddY > 0 && pull_current_state != PULL_REFRESH_RELEASE) {//释放刷新pull_current_state = PULL_REFRESH_RELEASE;updateHeaderState();} else if (paddY < 0 && pull_current_state != PULL_REFRESH_STATE) {pull_current_state = PULL_REFRESH_STATE;header_text.setText("开始刷新");updateHeaderState();}viewHeader.setPadding(0, paddY, 0, 0);return true;}break;case MotionEvent.ACTION_UP:if (pull_current_state == PULL_REFRESH_STATE) {updateHeaderState();} else if (pull_current_state == PULL_REFRESH_RELEASE) {pull_current_state = PULL_REFRESHING;updateHeaderState();}break;}return false;}
1.3、接口回调我们需要状态根据业务来动态调整,在可以刷新的时候做一些逻辑处理,同时处理完了,调整状态 。public void setPullDownFinish() {pull_current_state = PULL_REFRESH_STATE;viewHeader.setPadding(0, -heightHeader, 0, 0);}
public IPullDownRefreshService iPullDownRefreshService;public interface IPullDownRefreshService {void onPullDownRefresh();//下拉刷新void onLoadMore();//上拉加载更多刷新}public void setOnRefreshListener(IPullDownRefreshService iPullDownRefreshService) {this.iPullDownRefreshService = iPullDownRefreshService;}
准备工作做好后,我们在更新状态的地方调用public void updateHeaderState() {switch (pull_current_state) {//开始case PULL_REFRESH_STATE:break;//释放case PULL_REFRESH_RELEASE:break;//正在case PULL_REFRESHING:header_text.setText("刷新中.......");viewHeader.setPadding(0, 0, 0, 0);if (iPullDownRefreshService != null) {iPullDownRefreshService.onPullDownRefresh();}break;}}
Activity中使用,来一个3秒刷新完成mBinding.listview.setOnRefreshListener(new MyListview.IPullDownRefreshService() {@Overridepublic void onPullDownRefresh() {refreshSuccess();Toast.makeText(ActivityRefresh.this, "下拉-加载中.....", Toast.LENGTH_SHORT).show();}@Overridepublic void onLoadMore() {Toast.makeText(ActivityRefresh.this, "more-加载中.....", Toast.LENGTH_SHORT).show();}});CountDownTimer countDownTimer;public void refreshSuccess() {if (countDownTimer == null) {countDownTimer = new CountDownTimer(3000, 1000) {@Overridepublic void onTick(long millisUntilFinished) {}@Overridepublic void onFinish() {mBinding.listview.setPullDownFinish();countDownTimer.cancel();countDownTimer = null;}}.start();}}
经验总结扩展阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 自定义View6 -塔防小游戏:第三篇防御塔随意放置+多组野怪
- 自定义映射resultMap
- OpenDataV低代码平台增加自定义属性编辑
- 如何免费自定义qq主题
- vue3 自定义指令控制按钮权限
- 魅族mx5怎么设定自定义铃声
- 苹果手机怎么选择截屏(苹果手机怎么把截屏放在下拉菜单)
- iPhone苹果手机如何自定义设置墙纸?
- 吃鸡怎么自定义比赛?
- 王者荣耀自定义按键布局怎么设置?