1. 程式人生 > >xamarin ios pullRefresh 下拉重新整理,下拉載入更多

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