android 上拉刷新下拉加载

工具类:

public class XListView extends ListView implements OnScrollListener {

   private float mLastY = -1; // save event y
   private Scroller mScroller; // used for scroll back
   private OnScrollListener mScrollListener; // user's scroll listener

   // the interface to trigger refresh and load more.
   private IXListViewListener mListViewListener;

   // -- header view
   private XListViewHeader mHeaderView;
   // header view content, use it to calculate the Header's height. And hide it
   // when disable pull refresh.
   private RelativeLayout mHeaderViewContent;
   private TextView mHeaderTimeView;
   private int mHeaderViewHeight; // header view's height
   private boolean mEnablePullRefresh = true;
   private boolean mPullRefreshing = false; // is refreashing.

   // -- footer view
   private XListViewFooter mFooterView;
   private boolean mEnablePullLoad;
   private boolean mPullLoading;
   private boolean mIsFooterReady = false;
   
   // total list items, used to detect is at the bottom of listview.
   private int mTotalItemCount;

   // for mScroller, scroll back from header or footer.
   private int mScrollBack;
   private final static int SCROLLBACK_HEADER = 0;
   private final static int SCROLLBACK_FOOTER = 1;

   private final static int SCROLL_DURATION = 400; // scroll back duration
   private final static int PULL_LOAD_MORE_DELTA = 50; // when pull up >= 50px
                                          // at bottom, trigger
                                          // load more.
   private final static float OFFSET_RADIO = 1.8f; // support iOS like pull
                                       // feature.

   /**
    * @param context
    */
   public XListView(Context context) {
      super(context);
      initWithContext(context);
   }

   public XListView(Context context, AttributeSet attrs) {
      super(context, attrs);
      initWithContext(context);
   }

   public XListView(Context context, AttributeSet attrs, int defStyle) {
      super(context, attrs, defStyle);
      initWithContext(context);
   }

   private void initWithContext(Context context) {
      mScroller = new Scroller(context, new DecelerateInterpolator());
      // XListView need the scroll event, and it will dispatch the event to
      // user's listener (as a proxy).
      super.setOnScrollListener(this);

      // init header view
      mHeaderView = new XListViewHeader(context);
      mHeaderViewContent = (RelativeLayout) mHeaderView
            .findViewById(R.id.xlistview_header_content);
      mHeaderTimeView = (TextView) mHeaderView
            .findViewById(R.id.xlistview_header_time);
      addHeaderView(mHeaderView);

      // init footer view
      mFooterView = new XListViewFooter(context);

      // init header height
      mHeaderView.getViewTreeObserver().addOnGlobalLayoutListener(
            new OnGlobalLayoutListener() {
               @Override
               public void onGlobalLayout() {
                  mHeaderViewHeight = mHeaderViewContent.getHeight();
                  getViewTreeObserver()
                        .removeGlobalOnLayoutListener(this);
               }
            });
   }

// @Override
// protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//
//    int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
//    super.onMeasure(widthMeasureSpec, expandSpec);
// }

   @Override
   public void setAdapter(ListAdapter adapter) {
      // make sure XListViewFooter is the last footer view, and only add once.
      if (mIsFooterReady == false) {
         mIsFooterReady = true;
         addFooterView(mFooterView);
      }
      super.setAdapter(adapter);
   }
   /**
    * enable or disable pull down refresh feature.
    * 
    * @param enable
    */
   public void setPullRefreshEnable(boolean enable) {
      mEnablePullRefresh = enable;
      if (!mEnablePullRefresh) { // disable, hide the content
         mHeaderViewContent.setVisibility(View.INVISIBLE);
      } else {
         mHeaderViewContent.setVisibility(View.VISIBLE);
      }
   }

   /**
    * enable or disable pull up load more feature.
    * 
    * @param enable
    */
   public void setPullLoadEnable(boolean enable) {
      mEnablePullLoad = enable;
      if (!mEnablePullLoad) {
         mFooterView.hide();
         mFooterView.setOnClickListener(null);
         //make sure "pull up" don't show a line in bottom when listview with one page 
         setFooterDividersEnabled(false);
      } else {
         mPullLoading = false;
         mFooterView.show();
         mFooterView.setState(XListViewFooter.STATE_NORMAL);
         //make sure "pull up" don't show a line in bottom when listview with one page  
         setFooterDividersEnabled(true);
         // both "pull up" and "click" will invoke load more.
         mFooterView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
               startLoadMore();
            }
         });
      }
   }

   /**
    * stop refresh, reset header view.
    */
   public void stopRefresh() {
      if (mPullRefreshing == true) {
         mPullRefreshing = false;
         resetHeaderHeight();
      }
   }

   /**
    * stop load more, reset footer view.
    */
   public void stopLoadMore() {
      if (mPullLoading == true) {
         mPullLoading = false;
         mFooterView.setState(XListViewFooter.STATE_NORMAL);
      }
   }

   /**
    * set last refresh time
    * 
    * @param time
    */
   public void setRefreshTime(String time) {
      mHeaderTimeView.setText(time);
   }

   private void invokeOnScrolling() {
      if (mScrollListener instanceof OnXScrollListener) {
         OnXScrollListener l = (OnXScrollListener) mScrollListener;
         l.onXScrolling(this);
      }
   }

   private void updateHeaderHeight(float delta) {
      mHeaderView.setVisiableHeight((int) delta
            + mHeaderView.getVisiableHeight());
      if (mEnablePullRefresh && !mPullRefreshing) { // 未处于刷新状态,更新箭头
         if (mHeaderView.getVisiableHeight() > mHeaderViewHeight) {
            mHeaderView.setState(XListViewHeader.STATE_READY);
         } else {
            mHeaderView.setState(XListViewHeader.STATE_NORMAL);
         }
      }
      setSelection(0); // scroll to top each time
   }

   /**
    * reset header view's height.
    */
   private void resetHeaderHeight() {
      int height = mHeaderView.getVisiableHeight();
      if (height == 0) // not visible.
         return;
      // refreshing and header isn't shown fully. do nothing.
      if (mPullRefreshing && height <= mHeaderViewHeight) {
         return;
      }
      int finalHeight = 0; // default: scroll back to dismiss header.
      // is refreshing, just scroll back to show all the header.
      if (mPullRefreshing && height > mHeaderViewHeight) {
         finalHeight = mHeaderViewHeight;
      }
      mScrollBack = SCROLLBACK_HEADER;
      mScroller.startScroll(0, height, 0, finalHeight - height,
            SCROLL_DURATION);
      // trigger computeScroll
      invalidate();
   }

   private void updateFooterHeight(float delta) {
      int height = mFooterView.getBottomMargin() + (int) delta;
      if (mEnablePullLoad && !mPullLoading) {
         if (height > PULL_LOAD_MORE_DELTA) { // height enough to invoke load
                                       // more.
            mFooterView.setState(XListViewFooter.STATE_READY);
         } else {
            mFooterView.setState(XListViewFooter.STATE_NORMAL);
         }
      }
      mFooterView.setBottomMargin(height);

//    setSelection(mTotalItemCount - 1); // scroll to bottom
   }

   private void resetFooterHeight() {
      int bottomMargin = mFooterView.getBottomMargin();
      if (bottomMargin > 0) {
         mScrollBack = SCROLLBACK_FOOTER;
         mScroller.startScroll(0, bottomMargin, 0, -bottomMargin,
               SCROLL_DURATION);
         invalidate();
      }
   }

   private void startLoadMore() {
      mPullLoading = true;
      mFooterView.setState(XListViewFooter.STATE_LOADING);
      if (mListViewListener != null) {
         mListViewListener.onLoadMore();
      }
   }

   @Override
   public boolean onTouchEvent(MotionEvent ev) {
      if (mLastY == -1) {
         mLastY = ev.getRawY();
      }

      switch (ev.getAction()) {
      case MotionEvent.ACTION_DOWN:
         mLastY = ev.getRawY();
         break;
      case MotionEvent.ACTION_MOVE:
         final float deltaY = ev.getRawY() - mLastY;
         mLastY = ev.getRawY();
         if (getFirstVisiblePosition() == 0
               && (mHeaderView.getVisiableHeight() > 0 || deltaY > 0)) {
            // the first item is showing, header has shown or pull down.
            updateHeaderHeight(deltaY / OFFSET_RADIO);
            invokeOnScrolling();
         } else if (getLastVisiblePosition() == mTotalItemCount - 1
               && (mFooterView.getBottomMargin() > 0 || deltaY < 0)) {
            // last item, already pulled up or want to pull up.
            updateFooterHeight(-deltaY / OFFSET_RADIO);
         }
         break;
      default:
         mLastY = -1; // reset
         if (getFirstVisiblePosition() == 0) {
            // invoke refresh
            if (mEnablePullRefresh
                  && mHeaderView.getVisiableHeight() > mHeaderViewHeight) {
               mPullRefreshing = true;
               mHeaderView.setState(XListViewHeader.STATE_REFRESHING);
               if (mListViewListener != null) {
                  mListViewListener.onRefresh();
               }
            }
            resetHeaderHeight();
         } else if (getLastVisiblePosition() == mTotalItemCount - 1) {
            // invoke load more.
            if (mEnablePullLoad
                && mFooterView.getBottomMargin() > PULL_LOAD_MORE_DELTA
                && !mPullLoading) {
               startLoadMore();
            }
            resetFooterHeight();
         }
         break;
      }
      return super.onTouchEvent(ev);
   }

   @Override
   public void computeScroll() {
      if (mScroller.computeScrollOffset()) {
         if (mScrollBack == SCROLLBACK_HEADER) {
            mHeaderView.setVisiableHeight(mScroller.getCurrY());
         } else {
            mFooterView.setBottomMargin(mScroller.getCurrY());
         }
         postInvalidate();
         invokeOnScrolling();
      }
      super.computeScroll();
   }

   @Override
   public void setOnScrollListener(OnScrollListener l) {
      mScrollListener = l;
   }

   @Override
   public void onScrollStateChanged(AbsListView view, int scrollState) {
      if (mScrollListener != null) {
         mScrollListener.onScrollStateChanged(view, scrollState);
      }
   }

   @Override
   public void onScroll(AbsListView view, int firstVisibleItem,
         int visibleItemCount, int totalItemCount) {
      // send to user's listener
      mTotalItemCount = totalItemCount;
      if (mScrollListener != null) {
         mScrollListener.onScroll(view, firstVisibleItem, visibleItemCount,
               totalItemCount);
      }
   }

   public void setXListViewListener(IXListViewListener l) {
      mListViewListener = l;
   }

   /**
    * you can listen ListView.OnScrollListener or this one. it will invoke
    * onXScrolling when header/footer scroll back.
    */
   public interface OnXScrollListener extends OnScrollListener {
      public void onXScrolling(View view);
   }

   /**
    * implements this interface to get refresh/load more event.
    */
   public interface IXListViewListener {
      //下拉刷新回调
      public void onRefresh();
      //上拉加载更多回调
      public void onLoadMore();
   }
}
 
然后调用:
lv_applygame = (XListView) findViewById(R.id.lv_applygame);//找到listview
在初始化设置:
//打开上啦加载的开关
lv_applygame.setPullLoadEnable(true);
//设置监听
lv_applygame.setXListViewListener(this);
//点击事件 请求网络 刷新数据
lv_applygame.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, final int position, final long id) {
     //   listBean = getdata.getList().get((int) id);
        ToastUtils.showLongToast(ApplyActivity.this,String.valueOf(datas.get((int) id).getId()));
        Gameinfo1.Gameinfo1(ApplyActivity.this, datas.get((int) id).getId(), new GameinfoHandler() {
            @Override
            public void Success(Gameinfores.DataBean data) {
                Intent intent=new Intent(ApplyActivity.this,DetailsActivity.class);
              //  Log.e("aaaaa",data.toString());
                intent.putExtra("listBean",data);
                intent.putExtra("tuijianbean",getdata.getList().get((int) id));
                intent.putExtra("panduanid",datas.get((int) id).getStatus());
                intent.putExtra("gameid",datas.get((int) id).getId());

                startActivity(intent);
            }

            @Override
            public void Failed(int code, String errMsg) {

            }

        });

    }
});

//在数据源 设置适配器
lv_applygame.setAdapter(myapplyadapter);
//下拉刷新
@Override
public void onRefresh() {
  //  final String getpage = page + 1;
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            Gamelist1.Gamelist1(ApplyActivity.this, page,"",new GamelistHandler() {
                @Override
                public void Success(Gamelistres.DataBean data) {
                    onLoad();
                }
                @Override
                public void Failed(int code, String errMsg) {
                }
            });
        }
    },2000);
}
//上拉加载更多
@Override
public void onLoadMore() {
    page++;
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            Gamelist1.Gamelist1(ApplyActivity.this, page,"",new GamelistHandler() {
                @Override
                public void Success(Gamelistres.DataBean data) {
                  //  listBeen.add(data.getList().size(),data.getList().get(Integer.parseInt(getmorepage)));
                    datas.addAll(data.getList());
                    myapplyadapter.notifyDataSetChanged();
                    onLoad();
                }
                @Override
                public void Failed(int code, String errMsg) {
                }
            });
        }
    },2000);
}
private void onLoad() {
    lv_applygame.stopRefresh();//停止刷新
    lv_applygame.stopLoadMore();//停止加载更多
    SimpleDateFormat formatter = new SimpleDateFormat("MM-dd-HH:mm:ss");//设置日期显示格式
    Date curDate = new Date(System.currentTimeMillis());//获取当前时间
    String str = formatter.format(curDate);// 将时间装换为设置好的格式
    lv_applygame.setRefreshTime(str);//设置时间
}

//适配器做相应的操作
private class Myapplyadapter extends DefaultBaseAdapter<Gamelistres.DataBean.ListBean>{
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值