xamarin ios pullRefresh 下拉刷新,下拉加载更多


如果用tableviewcontroller 下拉刷新会自带,而且tableview 会自动适应屏幕。这样做的话这个界面的内容就要完全用cell承载了。

tableview pullRefresh 主要就是需要需要做下拉加载更多,这种需求,本人曾用两种的办法解决。题外话(如果不一定要上拉加载更多,可在构造最后一个cell后,多构造一个cell(button -》 加载更多))

1)在getcell 方法中判断如果 cell 为当前数据的最后一个。那么就去请求更多的数据。这样做的话只要构造最后一个cell的时候就会去加载数据,有一点不好控制用户是否真的想去请求数据。该方法实现简单,本文不展示代码。

2)在scroll中判断,如果用户上拉的距离达到一定高度是,则表明用户需要请求数据。

如下代码主要继承 talbesource ,来实现。其中用到两个xib ,分别是 上拉刷新,和下拉加载更多的 样式xib。

public class PLTableViewSource :UITableViewSource
	{
		UITableView tableview;
		public UIView headerView;
		public UIView footerView;


		RectangleF headerviewFrame;
		//bool isDragging;
		public bool isRefreshing;
		public bool isLoadingMore;
		public bool isCanLoadMore = true;
		public bool pullRefreshEnable=true;
		public bool clearSelectionOnViewWillApper;

		public const float DEFAULT_HEIGHT_OFFSET = 52f;


		public PLTableViewSource (UITableView p_tb)
		{
			this.tableview = p_tb;

			//set headerview
			var temp_views= NSBundle.MainBundle.LoadNib ("PLHeaderXib", this, null);
			this.headerView = MonoTouch.ObjCRuntime.Runtime.GetNSObject(temp_views.ValueAt (0)) as UIView;
			SetHeaderView (this.headerView);
			//set footerview
			temp_views= NSBundle.MainBundle.LoadNib ("PLFooterXib", this, null);
			this.footerView = MonoTouch.ObjCRuntime.Runtime.GetNSObject(temp_views.ValueAt (0)) as UIView;
			SetFooterView (this.footerView);
			//SetFooterViewVisibility (true);
		}


		#region Set Header View


		public void SetHeaderView(UIView hView)
		{
			if (tableview==null) {
				return;
			}
			if (null!=headerView&&headerView.IsDescendantOfView(tableview)) {
				headerView.RemoveFromSuperview ();
			}
			headerView.DangerousRelease ();
			headerView = null;
			if (hView!=null) {
				headerView = (UIView)hView.DangerousRetain();
				RectangleF f=headerView.Frame;
				headerviewFrame= headerView.Frame = new RectangleF (f.Location.X, 0 - f.Size.Height, f.Size.Width, f.Size.Height);
				tableview.AddSubview (headerView);
			}

		}

		public virtual float HeaderRefreshHeight()
		{
			if (headerviewFrame!=RectangleF.Empty) {
				return headerviewFrame.Size.Height;
			}
			return DEFAULT_HEIGHT_OFFSET;
		}

		protected virtual void PinHeaderView()
		{
			UIView.Animate (0.2, () => {
				this.tableview.ContentInset = new UIEdgeInsets(this.HeaderRefreshHeight(),0,0,0);
			});

			((PLHeaderXib)this.headerView).SetActivityAndMsg(string.Empty,true);
		}
		protected virtual void UnPinHeaderView(){
			UIView.Animate (0.2, () => {
				this.tableview.ContentInset = UIEdgeInsets.Zero;
			});

			((PLHeaderXib)this.headerView).SetActivityAndMsg(string.Empty,false);
		}
		private void WillBeginRefresh()
		{
			if (pullRefreshEnable) {
				PinHeaderView ();
			}
		}
		private void WillShowHeaderView(UIScrollView scrollview)
		{
		}
		private void HeaderViewDidScroll(bool willRefreshonRelease,UIScrollView scrollview)
		{

		}
		public virtual bool ReFresh()
		{
			if (isRefreshing) {
				return false;
			}
			this.WillBeginRefresh ();
			isRefreshing = true;
			return true;
		}

		public virtual void RefreshCompleted()
		{
			isRefreshing = false;
			if (pullRefreshEnable) {
				this.UnPinHeaderView ();
			}
		}
		#endregion

		#region  Set Footer View
		private void SetFooterView(UIView fview)
		{
			if (null==tableview) {
				return;
			}
			tableview.TableFooterView = null;
			footerView.DangerousRelease ();
			footerView = null;
			if (null!=fview) {
				footerView = (UIView)fview.DangerousRetain();
				tableview.TableFooterView = footerView;
			}
		}
		private void WillBeginLoadingMore(){}
		public virtual void LoadMoreCompleted()
		{
			isLoadingMore = false;
			SetFooterViewVisibility(false);
		}
		public virtual bool LoadMore()
		{
			if (isLoadingMore)
				return false;

			this.WillBeginLoadingMore();
			isLoadingMore = true;  
			SetFooterViewVisibility(true);
			return true;
		}

		public float FooterLoadMoreHeight()
		{
			if (null!=footerView) {
				return footerView.Frame.Size.Height;
			}
			return DEFAULT_HEIGHT_OFFSET;
		}

		public void SetFooterViewVisibility(bool visible)
		{
			if (visible&&this.tableview.TableFooterView!=footerView) {
				this.tableview.TableFooterView = footerView;
			}else if (!visible) {
				this.tableview.TableFooterView = null;
			}
		}
		#endregion

		#region all load completed

		public void AllLoadingCompleted()
		{
			if (isRefreshing) {
				this.RefreshCompleted ();
			}
			if (isLoadingMore) {
				this.LoadMoreCompleted ();
			}
		}
		#endregion



		#region tableview Source

		public override int RowsInSection (UITableView tableview, int section){return 0;}

		public override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath){return null;}

		#endregion

		#region scrollview delegate
		public override void WillEndDragging (UIScrollView scrollView, PointF velocity, ref PointF targetContentOffset)
		{
			if (isRefreshing||isLoadingMore) {
				return;
			}
			if (scrollView.ContentOffset.Y<=0-HeaderRefreshHeight()) {
				if (pullRefreshEnable) {
					ReFresh ();
				}
			}else if (scrollView.ContentSize.Height - scrollView.Frame.Size.Height - scrollView.ContentOffset.Y<FooterLoadMoreHeight()) {
				if (isCanLoadMore) {
					LoadMore ();
				}
			}
		}

		#endregion


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值