• 上拉刷新下拉加载


    //布局

    activity_main.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <com.zcp.util.XListView
    android:id="@+id/lv_main_reference"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

    </RelativeLayout>

    xlistview_footer.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">

    <RelativeLayout
    android:id="@+id/xlistview_footer_content"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:padding="10dp">


    <ProgressBar

    android:id="@+id/xlistview_footer_progressbar"
    android:layout_width="40dp"
    android:layout_height="40dp"
    android:layout_centerInParent="true"
    android:indeterminateDrawable="@drawable/frame_loading"
    android:visibility="visible" />

    <TextView
    android:id="@+id/xlistview_footer_hint_textview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:text="@string/xlistview_footer_hint_normal" />
    </RelativeLayout>

    </LinearLayout>

    xlistview_header.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="bottom">

    <RelativeLayout
    android:id="@+id/xlistview_header_content"
    android:layout_width="fill_parent"
    android:layout_height="60dp">

    <LinearLayout


    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:gravity="center"
    android:orientation="vertical"
    android:id="@+id/xlistview_header_text">

    <TextView
    android:id="@+id/xlistview_header_hint_textview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/xlistview_header_hint_normal" />

    <LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="3dp">

    <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/xlistview_header_last_time"
    android:textSize="12sp" />

    <TextView
    android:id="@+id/xlistview_header_time"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="12sp" />
    </LinearLayout>
    </LinearLayout>

    <ImageView
    android:id="@+id/xlistview_header_arrow"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@id/xlistview_header_text"
    android:layout_centerVertical="true"
    android:layout_marginLeft="-35dp"
    android:src="@drawable/xlistview_arrow" />

    <ProgressBar
    android:id="@+id/xlistview_header_progressbar"
    android:layout_width="30dp"
    android:layout_height="30dp"
    android:layout_alignLeft="@id/xlistview_header_text"
    android:layout_centerVertical="true"
    android:layout_marginLeft="-40dp"
    android:indeterminateDrawable="@drawable/frame_loading"
    android:visibility="invisible" />
    </RelativeLayout>

    </LinearLayout>

    res/drawable-hdpi/frame_loading.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">

    <item android:duration="150">
    <clip
    android:clipOrientation="horizontal"
    android:drawable="@drawable/loading_01"
    android:gravity="left" />
    </item>
    <item android:duration="150">
    <clip
    android:clipOrientation="horizontal"
    android:drawable="@drawable/loading_02"
    android:gravity="left" />
    </item>
    <item android:duration="150">
    <clip
    android:clipOrientation="horizontal"
    android:drawable="@drawable/loading_03"
    android:gravity="left" />
    </item>
    <item android:duration="150">
    <clip
    android:clipOrientation="horizontal"
    android:drawable="@drawable/loading_04"
    android:gravity="left" />
    </item>
    <item android:duration="150">
    <clip
    android:clipOrientation="horizontal"
    android:drawable="@drawable/loading_05"
    android:gravity="left" />
    </item>
    <item android:duration="150">
    <clip
    android:clipOrientation="horizontal"
    android:drawable="@drawable/loading_06"
    android:gravity="left" />
    </item>
    <item android:duration="150">
    <clip
    android:clipOrientation="horizontal"
    android:drawable="@drawable/loading_07"
    android:gravity="left" />
    </item>
    <item android:duration="150">
    <clip
    android:clipOrientation="horizontal"
    android:drawable="@drawable/loading_08"
    android:gravity="left" />
    </item>
    <item android:duration="150">
    <clip
    android:clipOrientation="horizontal"
    android:drawable="@drawable/loading_09"
    android:gravity="left" />
    </item>
    <item android:duration="150">
    <clip
    android:clipOrientation="horizontal"
    android:drawable="@drawable/loading_10"
    android:gravity="left" />
    </item>
    <item android:duration="150">
    <clip
    android:clipOrientation="horizontal"
    android:drawable="@drawable/loading_11"
    android:gravity="left" />
    </item>
    <item android:duration="150">
    <clip
    android:clipOrientation="horizontal"
    android:drawable="@drawable/loading_12"
    android:gravity="left" />
    </item>

    </animation-list>

    res/values/strings.xml

    <?xml version="1.0" encoding="utf-8"?>
    <resources>

    <string name="app_name">刷新加载</string>
    <string name="hello_world">Hello world!</string>
    <string name="menu_settings">Settings</string>


    <!--上拉刷新下拉加载控件的各个状态-->
    <string name="xlistview_header_hint_normal">下拉刷新</string>
    <string name="xlistview_header_hint_ready">松开刷新数据</string>
    <string name="xlistview_header_hint_loading">正在加载...</string>
    <string name="xlistview_header_last_time">上次更新时间:</string>
    <string name="xlistview_footer_hint_normal">查看更多</string>
    <string name="xlistview_footer_hint_ready">松开载入更多</string>


    <!--保存到本地的字段-->
    <string name="sp_name">egg_sp</string>
    </resources>

    //XListView

    /**
    * @file XListView.java
    * @package me.maxwin.view
    * @create Mar 18, 2012 6:28:41 PM
    * @author Maxwin
    * @description An ListView support (a) Pull down to refresh, (b) Pull up to load more.
    * Implement IXListViewListener, and see stopRefresh() / stopLoadMore().
    */
    package com.zcp.util;


    import com.zcp.sxjz.R;

    import android.content.Context;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.ViewTreeObserver.OnGlobalLayoutListener;
    import android.view.animation.DecelerateInterpolator;
    import android.widget.AbsListView;
    import android.widget.AbsListView.OnScrollListener;
    import android.widget.ListAdapter;
    import android.widget.ListView;
    import android.widget.RelativeLayout;
    import android.widget.Scroller;
    import android.widget.TextView;


    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.


    /* *//**
    * 鎵嬪娍鐨勫�鐞� *//*
    private GestureDetector mGestureDetector;
    private OnTouchListener mGestureListener;*/
    /**
    * @param context
    */
    public XListView(Context context) {
    super(context);
    initWithContext(context);
    /* mGestureDetector = new GestureDetector(new YScrollDetector());
    setFadingEdgeLength(0);*/
    }

    /* @Override
    public boolean onInterceptHoverEvent(MotionEvent event) {
    return super.onInterceptHoverEvent(event)&&mGestureDetector.onTouchEvent(event);
    }

    class YScrollDetector extends GestureDetector.SimpleOnGestureListener{

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
    //if(distanceY!=0 &&distanceX!=0){
    // }
    if(Math.abs(distanceY)>=Math.abs(distanceX)){
    return true;
    }else{
    return false;
    }
    }
    }*/

    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
    public void setAdapter(ListAdapter adapter) {
    // make sure XListViewFooter is the last footer view, and only add once.
    if (mIsFooterReady == false) {
    mIsFooterReady = true;
    if (getCount() > 10) {
    mFooterView.setVisibility(VISIBLE);
    } else {
    mFooterView.setVisibility(GONE);
    }
    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);
    } else {
    mPullLoading = false;
    mFooterView.show();
    mFooterView.setState(XListViewFooter.STATE_NORMAL);
    // 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
    */
    public void setRefreshTime(String strTime) {
    Log.d("shijiangeshi", strTime);
    mHeaderTimeView.setText(strTime);
    /*DateFormat dfFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date date = new Date(System.currentTimeMillis());
    String strTime = dfFormat.format(date);
    *//*String strTime = time.substring(0,10);*//*
    mHeaderTimeView.setText(strTime);*/
    }

    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:
    mFooterView.setState(mFooterView.STATE_NORMAL);
    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();
    }

    }

    //头部刷新

    /**
    * @file XListViewHeader.java
    * @create Apr 18, 2012 5:22:27 PM
    * @author Maxwin
    * @description XListView's header
    */
    package com.zcp.util;

    import com.zcp.sxjz.R;

    import android.content.Context;
    import android.util.AttributeSet;
    import android.view.Gravity;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.animation.Animation;
    import android.view.animation.RotateAnimation;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
    import android.widget.ProgressBar;
    import android.widget.TextView;

     

    public class XListViewHeader extends LinearLayout {
    private LinearLayout mContainer;
    private ImageView mArrowImageView;
    private ProgressBar mProgressBar;
    private TextView mHintTextView;
    private int mState = STATE_NORMAL;

    private Animation mRotateUpAnim;
    private Animation mRotateDownAnim;

    private final int ROTATE_ANIM_DURATION = 180;

    public final static int STATE_NORMAL = 0;
    public final static int STATE_READY = 1;
    public final static int STATE_REFRESHING = 2;

    public XListViewHeader(Context context) {
    super(context);
    initView(context);
    }

    /**
    * @param context
    * @param attrs
    */
    public XListViewHeader(Context context, AttributeSet attrs) {
    super(context, attrs);
    initView(context);
    }

    private void initView(Context context) {
    // 鍒濆�鎯呭喌锛岃�缃�笅鎷夊埛鏂皏iew楂樺害锟�0
    LayoutParams lp = new LayoutParams(
    LayoutParams.FILL_PARENT, 0);
    mContainer = (LinearLayout) LayoutInflater.from(context).inflate(
    R.layout.xlistview_header, null);
    addView(mContainer, lp);
    setGravity(Gravity.BOTTOM);

    mArrowImageView = (ImageView) findViewById(R.id.xlistview_header_arrow);
    mHintTextView = (TextView) findViewById(R.id.xlistview_header_hint_textview);
    mProgressBar = (ProgressBar) findViewById(R.id.xlistview_header_progressbar);

    mRotateUpAnim = new RotateAnimation(0.0f, -180.0f,
    Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
    0.5f);
    mRotateUpAnim.setDuration(ROTATE_ANIM_DURATION);
    mRotateUpAnim.setFillAfter(true);
    mRotateDownAnim = new RotateAnimation(-180.0f, 0.0f,
    Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
    0.5f);
    mRotateDownAnim.setDuration(ROTATE_ANIM_DURATION);
    mRotateDownAnim.setFillAfter(true);
    }

    public void setState(int state) {
    if (state == mState)
    return;

    if (state == STATE_REFRESHING) { // 鏄剧ず杩涘害
    mArrowImageView.clearAnimation();
    mArrowImageView.setVisibility(View.INVISIBLE);
    mProgressBar.setVisibility(View.VISIBLE);
    } else { // 鏄剧ず绠�ご鍥剧墖
    mArrowImageView.setVisibility(View.VISIBLE);
    mProgressBar.setVisibility(View.INVISIBLE);
    }

    switch (state) {
    case STATE_NORMAL:
    if (mState == STATE_READY) {
    mArrowImageView.startAnimation(mRotateDownAnim);
    }
    if (mState == STATE_REFRESHING) {
    mArrowImageView.clearAnimation();
    }
    mHintTextView.setText(R.string.xlistview_header_hint_normal);
    break;
    case STATE_READY:
    if (mState != STATE_READY) {
    mArrowImageView.clearAnimation();
    mArrowImageView.startAnimation(mRotateUpAnim);
    mHintTextView.setText(R.string.xlistview_header_hint_ready);
    }
    break;
    case STATE_REFRESHING:
    mHintTextView.setText(R.string.xlistview_header_hint_loading);
    break;
    default:
    }

    mState = state;
    }

    public void setVisiableHeight(int height) {
    if (height < 0)
    height = 0;
    LayoutParams lp = (LayoutParams) mContainer
    .getLayoutParams();
    lp.height = height;
    mContainer.setLayoutParams(lp);
    }

    public int getVisiableHeight() {
    return mContainer.getHeight();
    }

    }

    //尾部加载

    /**
    * @file XFooterView.java
    * @create Mar 31, 2012 9:33:43 PM
    * @author Maxwin
    * @description XListView's footer
    */
    package com.zcp.util;


    import com.zcp.sxjz.R;

    import android.content.Context;
    import android.util.AttributeSet;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.widget.LinearLayout;
    import android.widget.TextView;

     

    public class XListViewFooter extends LinearLayout {
    public final static int STATE_NORMAL = 0;
    public final static int STATE_READY = 1;
    public final static int STATE_LOADING = 2;

    private Context mContext;

    private View mContentView;
    private View mProgressBar;
    private TextView mHintView;

    public XListViewFooter(Context context) {
    super(context);
    initView(context);
    }

    public XListViewFooter(Context context, AttributeSet attrs) {
    super(context, attrs);
    initView(context);
    }


    public void setState(int state) {
    mHintView.setVisibility(View.INVISIBLE);
    mProgressBar.setVisibility(View.INVISIBLE);
    mHintView.setVisibility(View.INVISIBLE);
    if (state == STATE_READY) {
    mHintView.setVisibility(View.VISIBLE);
    mHintView.setText(R.string.xlistview_footer_hint_ready);
    } else if (state == STATE_LOADING) {
    mProgressBar.setVisibility(View.VISIBLE);
    } else {
    mHintView.setVisibility(View.VISIBLE);
    mHintView.setText(R.string.xlistview_footer_hint_normal);
    }
    }

    public void setBottomMargin(int height) {
    if (height < 0) return;
    LayoutParams lp = (LayoutParams) mContentView.getLayoutParams();
    lp.bottomMargin = height;
    mContentView.setLayoutParams(lp);
    }

    public int getBottomMargin() {
    LayoutParams lp = (LayoutParams) mContentView.getLayoutParams();
    return lp.bottomMargin;
    }


    /**
    * normal status
    */
    public void normal() {
    mHintView.setVisibility(View.VISIBLE);
    mProgressBar.setVisibility(View.GONE);
    }


    /**
    * loading status
    */
    public void loading() {
    mHintView.setVisibility(View.GONE);
    mProgressBar.setVisibility(View.VISIBLE);
    }

    /**
    * hide footer when disable pull load more
    */
    public void hide() {
    LayoutParams lp = (LayoutParams) mContentView.getLayoutParams();
    lp.height = 0;
    mContentView.setLayoutParams(lp);
    }

    /**
    * show footer
    */
    public void show() {
    LayoutParams lp = (LayoutParams) mContentView.getLayoutParams();
    lp.height = LayoutParams.WRAP_CONTENT;
    mContentView.setLayoutParams(lp);
    }

    private void initView(Context context) {
    mContext = context;
    LinearLayout moreView = (LinearLayout) LayoutInflater.from(mContext).inflate(R.layout.xlistview_footer, null);
    addView(moreView);
    moreView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));

    mContentView = moreView.findViewById(R.id.xlistview_footer_content);
    mProgressBar = moreView.findViewById(R.id.xlistview_footer_progressbar);
    mHintView = (TextView) moreView.findViewById(R.id.xlistview_footer_hint_textview);

    // moreView.setVisibility(GONE);
    }


    }

    SharePreferences工具类

    package com.zcp.util;

    import com.zcp.sxjz.R;

    import android.content.Context;
    import android.content.SharedPreferences;
    /**
    * SharePreferences宸ュ叿绫� */
    public class PreferencesUtil {

    public static SharedPreferences preferences;
    /*
    * 灏嗘暟鎹�瓨鍏ラ厤缃�枃浠剁殑鏂规硶
    * void鏃犺繑鍥炵被鍨� */
    public static <T> String putPreferences(String key, T value, Context context) {
    checkSP(context);
    SharedPreferences.Editor editor = preferences.edit();
    if (value instanceof String) {
    editor.putString(key, value.toString());
    } else if (value instanceof Boolean) {
    editor.putBoolean(key, ((Boolean) value).booleanValue());
    } else if (value instanceof Integer) {
    editor.putInt(key, ((Integer) value).intValue());
    } else if (value instanceof Float) {
    editor.putFloat(key, ((Float) value).floatValue());
    } else if (value instanceof Long) {
    editor.putLong(key, ((Long) value).longValue());
    }
    editor.commit();
    return key;
    }
    /*
    * 妫�煡閰嶇疆鏂囦欢鏄�惁瀛樺湪
    */
    private static void checkSP(Context context) {
    if (preferences == null) {
    preferences = context.getSharedPreferences(context.getString(R.string.sp_name), Context.MODE_PRIVATE);
    }
    }
    /*
    * 鑾峰彇閰嶇疆鏂囦欢鍐呭�鐨勬柟娉� * 杩斿洖绫诲瀷涓烘硾鍨嬶細-T绫诲瀷
    */
    @SuppressWarnings("unchecked")
    public static <T> T getPreferences(String key, T value, Context context) {
    checkSP(context);
    Object o = null;
    if (value instanceof String) {
    o = preferences.getString(key, value.toString());
    } else if (value instanceof Boolean) {
    o = preferences.getBoolean(key,
    ((Boolean) value).booleanValue());
    } else if (value instanceof Integer) {
    o = preferences.getInt(key,
    ((Integer) value).intValue());
    } else if (value instanceof Float) {
    o = preferences.getFloat(key,
    ((Float) value).floatValue());
    } else if (value instanceof Long) {
    o = preferences.getLong(key,
    ((Long) value).longValue());
    }
    T t = (T) o;

    return t;
    }

    public static void clear() {
    SharedPreferences.Editor editor = preferences.edit();
    editor.clear();
    editor.commit();
    }
    }

    加载数据的时间

    package com.zcp.util;

    import java.text.SimpleDateFormat;
    import java.util.Calendar;

    import android.content.Context;
    import android.text.format.Time;

    /**
    * Created by Administrator on 2015/7/9 0009.
    */
    public class SimpleDataExample {

    public static void setFormat(String classifyId, Context context) {

    SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String date = sDateFormat.format(new java.util.Date());
    PreferencesUtil.putPreferences(classifyId, date, context);
    }

    //寰楀埌涓婃�鍔犺浇鐨勬暟鎹�椂闂�
    public static void getFormat(String classifyId, Context context, XListView listView) {
    listView.stopRefresh();
    listView.stopLoadMore();
    String time = PreferencesUtil.getPreferences(classifyId, "yyyy-MM-dd", context);
    listView.setRefreshTime(time);

    }


    //鏂逛究璋冪敤鍚堟垚涓婇潰鐨勪袱涓�柟娉�
    public static void getsetFormat(String type, Context context, XListView listView) {
    SimpleDataExample.setFormat(type, context);
    SimpleDataExample.getFormat(type, context, listView);
    }

    /**
    * 涓庡綋鍓嶆棩鏈熸瘮杈� */
    public static boolean getJudge(int year, int month, int monthDay) {
    Time time = new Time("GMT+8");
    time.setToNow();
    int currentYear = time.year;
    int currentMonth = time.month;
    int currentDay = time.monthDay;
    if (year > currentYear) {
    return false;
    } else if (year == currentYear && month > (currentMonth + 1)) {
    return false;
    } else if (year == currentYear && month == (currentMonth + 1) && monthDay > currentDay) {
    return false;
    } else {
    return true;
    }
    }

    /**
    * 涓庡綋鍓嶆棩鏈熸瘮杈� */
    public static boolean getJudgedata(int year, int month, int monthDay) {

    Time time = new Time("GMT+8");
    time.setToNow();
    int currentYear = time.year;
    int currentMonth = time.month;
    int currentDay = time.monthDay;
    if (year > currentYear) {
    return true;
    } else if (year == currentYear && month > (currentMonth + 1)) {
    return true;
    } else if (year == currentYear && month == (currentMonth + 1) && monthDay >= currentDay) {
    return true;
    } else {
    return false;
    }
    }


    /**
    * 涓庡綋鍓嶆棩鏈熸瘮杈� */
    public static boolean getJudgeTime(int hour, int minute) {
    Calendar c = Calendar.getInstance();//鍙�互瀵规瘡涓�椂闂村煙鍗曠嫭淇�敼
    int currenthour = c.get(Calendar.HOUR_OF_DAY);
    int currentminute = c.get(Calendar.MINUTE);

    if (hour > currenthour) {
    return true;
    } else if (hour == currenthour && minute >= currentminute) {
    return true;
    } else {
    return false;
    }
    }
    }

    MainActivity 

    package com.zcp.sxjz;

    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;

    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.util.EntityUtils;

    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.widget.Toast;

    import com.google.gson.Gson;
    import com.zcp.bean.Good;
    import com.zcp.bean.Myresult;
    import com.zcp.bean.Myrows;
    import com.zcp.bean.Person;
    import com.zcp.util.SimpleDataExample;
    import com.zcp.util.XListView;
    import com.zcp.util.XListView.IXListViewListener;

    public class MainActivity extends Activity implements IXListViewListener{
    String uri="http://api.fang.anjuke.com/m/android/1.3/shouye/recInfosV3/?city_id=14&lat=40.04652&lng=116.306033&api_key=androidkey&sig=9317e9634b5fbc16078ab07abb6661c5&macid=45cd2478331b184ff0e15f29aaa89e3e&app=a-ajk&_pid=11738&o=PE-TL10-user+4.4.2+HuaweiPE-TL10+CHNC00B260+ota-rel-keys%2Crelease-keys&from=mobile&m=Android-PE-TL10&cv=9.5.1&cid=14&i=864601026706713&v=4.4.2&qtime=20160411091603&pm=b61&uuid=1848c59c-185d-48d9-b0e9-782016041109&_chat_id=0";
    private XListView listview;
    private MyAdapter adapter;
    private List<Myrows> list=new ArrayList<Myrows>();
    private List<Myrows> list1=new ArrayList<Myrows>();
    private HttpResponse res;
    private HttpEntity en;
    private String s;
    private boolean flag;
    private List<Myrows> d;
    private Handler h;
    private int j=20;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    listview = (XListView) findViewById(R.id.lv_main_reference);
    new Thread(){
    public void run() {
    init();
    };
    }.start();
    h=new Handler(){

    public void handleMessage(android.os.Message msg) {
    String s=(String) msg.obj;
    Gson gson=new Gson();
    Good c=gson.fromJson(s,Good.class);

    Myresult r = c.getResult();
    d=r.getRows();

    listUtil(d);

    adapter = new MyAdapter(list,MainActivity.this);
    listview.setAdapter(adapter);
    };
    };

    // 添加XListView的上拉和下拉刷新监听器
    listview.setPullLoadEnable(true);
    listview.setPullRefreshEnable(true);
    listview.setXListViewListener(this);
    }
    public void init() {

    HttpClient client=new DefaultHttpClient();
    HttpGet get=new HttpGet(uri);
    try {
    res=client.execute(get);
    int i=res.getStatusLine().getStatusCode();
    if(i==200){
    en=res.getEntity();
    s=EntityUtils.toString(en,"utf-8");
    Message message=Message.obtain();
    message.obj=s;
    h.sendMessage(message);
    }
    } catch (ClientProtocolException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    //下拉刷新
    @Override
    public void onRefresh() {

    listUtil(d);
    adapter.notifyDataSetChanged();

    SimpleDataExample.setFormat("dddddddddddd", getApplicationContext());
    SimpleDataExample.getFormat("dddddddddddd", getApplicationContext(),listview);
    }

    //上拉加载
    @Override
    public void onLoadMore() {
    listUtil01(d);
    adapter.notifyDataSetChanged();

    SimpleDataExample.setFormat("dddddddddddd", getApplicationContext());
    SimpleDataExample.getFormat("dddddddddddd", getApplicationContext(),listview);
    }
    public void listUtil(List<Myrows> d){
    list.clear();
    for (int i = 0; i <d.size(); i++) {
    if(i<10){
    list.add(d.get(i));
    }else{
    list1.add(d.get(i));
    }
    }
    }
    public void listUtil01(List<Myrows> d){
    list.clear();
    for (int i =0; i <j; i++) {
    if(i==d.size()){
    Toast.makeText(MainActivity.this,"已经是最后一条了",1).show();
    return;
    }
    list.add(d.get(i));

    }
    j+=10;
    }
    }

    package com.zcp.sxjz;

    import java.util.List;

    import com.lidroid.xutils.BitmapUtils;
    import com.zcp.bean.Myrows;

    import android.content.Context;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.ImageView;
    import android.widget.TextView;

    public class MyAdapter extends BaseAdapter{
    private List<Myrows> list;
    private Context context;
    private ImageView img;
    private TextView tv;
    private BitmapUtils utils;

    public MyAdapter(List<Myrows> list, Context context) {
    super();
    this.list = list;
    this.context = context;
    utils=new BitmapUtils(context);
    }

    @Override
    public int getCount() {

    return list.size();
    }

    @Override
    public Object getItem(int position) {
    return list.get(position);
    }

    @Override
    public long getItemId(int position) {
    return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder viewHolder;
    if (convertView==null) {
    convertView=View.inflate(context, R.layout.itme, null);
    viewHolder=new ViewHolder();
    viewHolder.imageView=(ImageView) convertView.findViewById(R.id.image);
    viewHolder.text1=(TextView) convertView.findViewById(R.id.text1);
    viewHolder.text2=(TextView) convertView.findViewById(R.id.text2);
    viewHolder.text3=(TextView) convertView.findViewById(R.id.text3);
    viewHolder.text4=(TextView) convertView.findViewById(R.id.text4);
    viewHolder.text5=(TextView) convertView.findViewById(R.id.text5);
    viewHolder.text6=(TextView) convertView.findViewById(R.id.text6);
    convertView.setTag(viewHolder);
    }else{
    viewHolder=(ViewHolder) convertView.getTag();
    }

    BitmapUtils utils=new BitmapUtils(context);
    utils.display(viewHolder.imageView, list.get(position).getInfo().getDefault_image());

    viewHolder.text1.setText(list.get(position).getInfo().getAddress());
    viewHolder.text2.setText(list.get(position).getInfo().getRegion_title()+"--");
    viewHolder.text3.setText(list.get(position).getInfo().getSub_region_title());
    viewHolder.text4.setText(list.get(position).getInfo().getShow_activity().getTitle());
    viewHolder.text5.setText(list.get(position).getInfo().getTags());
    viewHolder.text6.setText(list.get(position).getInfo().getLoupan_name());

    return convertView;
    }
    class ViewHolder{
    ImageView imageView;
    TextView text1;
    TextView text2;
    TextView text3;
    TextView text4;
    TextView text5;
    TextView text6;

    }
    }

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <ImageView
    android:id="@+id/image"
    android:layout_width="80dp"
    android:layout_height="80dp"

    />
    <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    >
    <TextView
    android:id="@+id/text1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="ddddddddd"
    />
    <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"

    >
    <TextView
    android:id="@+id/text2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="ddddddddd"
    />
    <TextView
    android:id="@+id/text3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="ddddddddd"
    />
    <TextView
    android:id="@+id/text4"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="ddddddddd"
    android:layout_marginRight="10dp"
    />
    </LinearLayout>
    <TextView
    android:id="@+id/text5"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="ddddddddd"
    />
    <TextView
    android:id="@+id/text6"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="ddddddddd"
    />
    </LinearLayout>
    </LinearLayout>

  • 相关阅读:
    redis问题排查
    javassist介绍
    Idea创建父子工程
    sentry的配置
    Redis的基本操作以及info命令
    es~日期类型需要注意的
    jboss~静态文件路由和自定义日志
    java~RMI引起的log4j漏洞
    链路跟踪~对接阿里ARMS
    navicat~导出数据库密码
  • 原文地址:https://www.cnblogs.com/hnpy/p/5479497.html
Copyright © 2020-2023  润新知