android的SwipeRefreshLayout 扩展

本文介绍了一种在SwipeRefreshLayout中实现上拉加载功能的方法。通过重写并扩展SwipeRefreshLayout类,作者实现了当用户上拉列表到底部时触发加载更多数据的功能。文章提供了完整的代码示例,包括关键的触摸事件处理和滚动监听逻辑。

最近在用SwipeRefreshLayout   发现没有 上拉加载功能 ,自己 闲暇之余 谢了一个上拉刷新, 话不多说上代码了希望对大家有所帮助!

package com.baicheng.baic.refreshview;


import com.baicheng.baic.R;


import android.content.Context;
import android.support.v4.widget.SwipeRefreshLayout;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ListView;


/**
 * 
 * @author Mr.张
 * 
 */
public class RefreshLayout extends SwipeRefreshLayout implements
		OnScrollListener {
	/**
	 * 滑动到最底部的上拉操作
	 */
	private int mTouchSlop;
	/**
	 * 
	 * listView 实例
	 */


	private ListView mListView;


	/**
	 * 到了最底部的上拉 加载操作
	 */
	private OnLoadListener mOnLoadListener;
	/**
	 * ListView 的footView
	 */
	private View mListViewfooter;
	/**
	 * 按下时Y的坐标
	 */
	private int mDownY;
	/**
	 * 抬起时的y坐标, 与mYDown一起用于滑动到底部时判断是上拉还是下拉
	 */
	private int mLastY;
	/**
	 * 是否在加载中 ( 上拉加载更多 )
	 */
	private boolean isLoading = false;


	public RefreshLayout(Context context) {
		this(context, null);
		// TODO Auto-generated constructor stub
	}


	public RefreshLayout(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
		mTouchSlop = ViewConfiguration.get(context).getScaledDoubleTapSlop();
		mListViewfooter = LayoutInflater.from(context).inflate(
				R.layout.newlistview_footer, null, false);
	}


	@Override
	protected void onLayout(boolean changed, int left, int top, int right,
			int bottom) {
		// TODO Auto-generated method stub
		super.onLayout(changed, left, top, right, bottom);
		// 初始化listView
		if (mListView == null) {


		}
	}


	public void getListView() {


		int childs = getChildCount();
		if (childs > 0) {
			View childView = getChildAt(0);
			if (childView instanceof ListView) {
				mListView = (ListView) childView;
				// 设置listView 在滚吨状态下也可以加载
				mListView.setOnScrollListener(this);
			}


		}
	}


	@Override
	public boolean dispatchTouchEvent(MotionEvent ev) {
		// TODO Auto-generated method stub
		final int action = ev.getAction();
		switch (action) {
		case MotionEvent.ACTION_DOWN:
			mDownY = (int) ev.getRawY();
			break;
		case MotionEvent.ACTION_MOVE:
			mLastY = (int) ev.getRawY();
			break;
		case MotionEvent.ACTION_UP:
			if (mCanLoad()) {


				loadData();
			}
			break; 
		default:
			break;
		}


		return super.dispatchTouchEvent(ev);
	}


	/**
	 * 判断是否到了底部
	 */


	private boolean isBotton() {
		if (mListView != null && mListView.getAdapter() != null) {


			return mListView.getLastVisiblePosition() == (mListView
					.getAdapter().getCount() - 1);
		}


		return false;
	}


	/**
	 * 是否为上拉操作
	 */
	public boolean isPullUp() {


		return (mDownY - mLastY) >= mTouchSlop;


	}


	/**
	 * 是否可以加载更多, 条件是到了最底部, listview不在加载中, 且为上拉操作.
	 * 
	 * @return
	 */
	private boolean mCanLoad() {


		return isBotton() && isPullUp() && !isLoading;


	}


	/**
	 * 如果到了底部而且是上拉操作执行loadData
	 */
	private void loadData() {
		if (mOnLoadListener != null) {
			// 设置状态
			setLoading(true);
			//
			mOnLoadListener.onLoad();
		}


	}


	public void setLoading(boolean loading) {
		isLoading = loading;
		if (isLoading) {


			mListView.addFooterView(mListViewfooter);


		} else {
			mListView.removeFooterView(mListViewfooter);
			mLastY = 0;
			mDownY = 0;


		}


	}


	/**
	 * @param loadListener
	 */
	public void setOnLoadListener(OnLoadListener loadListener) {
		mOnLoadListener = loadListener;
	}


	@Override
	public void onScrollStateChanged(AbsListView view, int scrollState) {
		// TODO Auto-generated method stub


	}


	@Override
	public void onScroll(AbsListView view, int firstVisibleItem,
			int visibleItemCount, int totalItemCount) {
		// TODO Auto-generated method stub
		if (mCanLoad()) {


			loadData();


		}
	}


	/**
	 * 加载更多的监听器
	 * 
	 * @author mrsimple
	 */
	public static interface OnLoadListener {
		public void onLoad();
	}



内容概要:本文详细介绍了“秒杀商城”微服务架构的设计与实战全过程,涵盖系统从需求分析、服务拆分、技术选型到核心功能开发、分布式事务处理、容器化部署及监控链路追踪的完整流程。重点解决了高并发场景下的超卖问题,采用Redis预减库存、消息队列削峰、数据库乐观锁等手段保障数据一致性,并通过Nacos实现服务注册发现与配置管理,利用Seata处理跨服务分布式事务,结合RabbitMQ实现异步下单,提升系统吞吐能力。同时,项目支持Docker Compose快速部署和Kubernetes生产级编排,集成Sleuth+Zipkin链路追踪与Prometheus+Grafana监控体系,构建可观测性强的微服务系统。; 适合人群:具备Java基础和Spring Boot开发经验,熟悉微服务基本概念的中高级研发人员,尤其是希望深入理解高并发系统设计、分布式事务、服务治理等核心技术的开发者;适合工作2-5年、有志于转型微服务或提升架构能力的工程师; 使用场景及目标:①学习如何基于Spring Cloud Alibaba构建完整的微服务项目;②掌握秒杀场景下高并发、超卖控制、异步化、削峰填谷等关键技术方案;③实践分布式事务(Seata)、服务熔断降级、链路追踪、统一配置中心等企业级中间件的应用;④完成从本地开发到容器化部署的全流程落地; 阅读建议:建议按照文档提供的七个阶段循序渐进地动手实践,重点关注秒杀流程设计、服务间通信机制、分布式事务实现和系统性能优化部分,结合代码调试与监控工具深入理解各组件协作原理,真正掌握高并发微服务系统的构建能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值