如果用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