zoukankan      html  css  js  c++  java
  • Android学习之listview的下拉刷新、上拉载入

    本例是在上例的基础上完成的。本例实现的listview上拉载入、下拉刷新功能,是在开源网站上别人写好的listview,主要是对listview的控件进行重写,添加了footer和header。

    1.listview_footer

    listview_footer是listview的底部。

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:layout_width="fill_parent"
     4     android:layout_height="wrap_content" >
     5 
     6     <RelativeLayout
     7         android:id="@+id/xlistview_footer_content"
     8         android:layout_width="fill_parent"
     9         android:layout_height="wrap_content"
    10         android:padding="10dp" >
    11 
    12         <ProgressBar
    13             android:id="@+id/xlistview_footer_progressbar"
    14             android:layout_width="wrap_content"
    15             android:layout_height="wrap_content"
    16             android:layout_centerInParent="true"
    17             android:visibility="invisible" />
    18 
    19         <TextView
    20             android:id="@+id/xlistview_footer_hint_textview"
    21             android:layout_width="wrap_content"
    22             android:layout_height="wrap_content"
    23             android:layout_centerInParent="true"
    24             android:text="@string/xlistview_footer_hint_normal" />
    25     </RelativeLayout>
    26 
    27 </LinearLayout>
    lsitview_footer

    listview_footer由ProgressBar和textview组成。用户点击textview或者上拉的时候,会触发监听事件,实现更多数据的载入。

     1 public final static int STATE_NORMAL = 0;
     2     public final static int STATE_READY = 1;
     3     public final static int STATE_LOADING = 2;
     4 
     5     private Context mContext;
     6 
     7     private View mContentView;
     8     private View mProgressBar;
     9     private TextView mHintView;
    10     
    11     public XListViewFooter(Context context) {
    12         super(context);
    13         initView(context);
    14     }
    15     
    16     public XListViewFooter(Context context, AttributeSet attrs) {
    17         super(context, attrs);
    18         initView(context);
    19     }
    20 
    21     
    22     public void setState(int state) {
    23         mHintView.setVisibility(View.INVISIBLE);
    24         mProgressBar.setVisibility(View.INVISIBLE);
    25         mHintView.setVisibility(View.INVISIBLE);
    26         if (state == STATE_READY) {
    27             mHintView.setVisibility(View.VISIBLE);
    28             mHintView.setText(R.string.xlistview_footer_hint_ready);
    29         } else if (state == STATE_LOADING) {
    30             mProgressBar.setVisibility(View.VISIBLE);
    31         } else {
    32             mHintView.setVisibility(View.VISIBLE);
    33             mHintView.setText(R.string.xlistview_footer_hint_normal);
    34         }
    35     }
    36     
    37     public void setBottomMargin(int height) {
    38         if (height < 0) return ;
    39         LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)mContentView.getLayoutParams();
    40         lp.bottomMargin = height;
    41         mContentView.setLayoutParams(lp);
    42     }
    43     
    44     public int getBottomMargin() {
    45         LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)mContentView.getLayoutParams();
    46         return lp.bottomMargin;
    47     }
    48     
    49     /**
    50      * normal status
    51      */
    52     public void normal() {
    53         mHintView.setVisibility(View.VISIBLE);
    54         mProgressBar.setVisibility(View.GONE);
    55     }
    56     
    57     
    58     /**
    59      * loading status 
    60      */
    61     public void loading() {
    62         mHintView.setVisibility(View.GONE);
    63         mProgressBar.setVisibility(View.VISIBLE);
    64     }
    65     
    66     /**
    67      * hide footer when disable pull load more
    68      */
    69     public void hide() {
    70         LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)mContentView.getLayoutParams();
    71         lp.height = 0;
    72         mContentView.setLayoutParams(lp);
    73     }
    74     
    75     /**
    76      * show footer
    77      */
    78     public void show() {
    79         LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)mContentView.getLayoutParams();
    80         lp.height = LayoutParams.WRAP_CONTENT;
    81         mContentView.setLayoutParams(lp);
    82     }
    83     
    84     private void initView(Context context) {
    85         mContext = context;
    86         LinearLayout moreView = (LinearLayout)LayoutInflater.from(mContext).inflate(R.layout.xlistview_footer, null);
    87         addView(moreView);
    88         moreView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
    89         
    90         mContentView = moreView.findViewById(R.id.xlistview_footer_content);
    91         mProgressBar = moreView.findViewById(R.id.xlistview_footer_progressbar);
    92         mHintView = (TextView)moreView.findViewById(R.id.xlistview_footer_hint_textview);
    93     }
    listview_footer

    后台代码定义了listview_footer的状态变化,包括加载、停止加载等,实现了对事件的监听。

    2.listview_header

    listview_header是listview显示的时候头部文件。用户下拉的时候,实现数据的重新载入。

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:layout_width="fill_parent"
     4     android:layout_height="wrap_content"
     5     android:gravity="bottom" >
     6 
     7     <RelativeLayout
     8         android:id="@+id/xlistview_header_content"
     9         android:layout_width="fill_parent"
    10         android:layout_height="60dp" >
    11 
    12         <LinearLayout
    13             android:layout_width="wrap_content"
    14             android:layout_height="wrap_content"
    15             android:layout_centerInParent="true"
    16             android:gravity="center"
    17             android:orientation="vertical" android:id="@+id/xlistview_header_text">
    18 
    19             <TextView
    20                 android:id="@+id/xlistview_header_hint_textview"
    21                 android:layout_width="wrap_content"
    22                 android:layout_height="wrap_content"
    23                 android:text="@string/xlistview_header_hint_normal" />
    24 
    25             <LinearLayout
    26                 android:layout_width="wrap_content"
    27                 android:layout_height="wrap_content"
    28                 android:layout_marginTop="3dp" >
    29 
    30                 <TextView
    31                     android:layout_width="wrap_content"
    32                     android:layout_height="wrap_content"
    33                     android:text="@string/xlistview_header_last_time"
    34                     android:textSize="12sp" />
    35 
    36                 <TextView
    37                     android:id="@+id/xlistview_header_time"
    38                     android:layout_width="wrap_content"
    39                     android:layout_height="wrap_content"
    40                     android:textSize="12sp" />
    41             </LinearLayout>
    42         </LinearLayout>
    43 
    44         <ImageView
    45             android:id="@+id/xlistview_header_arrow"
    46             android:layout_width="wrap_content"
    47             android:layout_height="wrap_content"
    48             android:layout_alignLeft="@id/xlistview_header_text"
    49             android:layout_centerVertical="true"
    50             android:layout_marginLeft="-35dp"
    51             android:src="@drawable/xlistview_arrow" />
    52 
    53         <ProgressBar
    54             android:id="@+id/xlistview_header_progressbar"
    55             android:layout_width="30dp"
    56             android:layout_height="30dp"
    57             android:layout_alignLeft="@id/xlistview_header_text"
    58             android:layout_centerVertical="true"
    59             android:layout_marginLeft="-40dp"
    60             android:visibility="invisible" />
    61     </RelativeLayout>
    62 
    63 </LinearLayout>
    listview_header

    xml部分由textview和imageview组成。

      1 private LinearLayout mContainer;
      2     private ImageView mArrowImageView;
      3     private ProgressBar mProgressBar;
      4     private TextView mHintTextView;
      5     private int mState = STATE_NORMAL;
      6 
      7     private Animation mRotateUpAnim;
      8     private Animation mRotateDownAnim;
      9     
     10     private final int ROTATE_ANIM_DURATION = 180;
     11     
     12     public final static int STATE_NORMAL = 0;
     13     public final static int STATE_READY = 1;
     14     public final static int STATE_REFRESHING = 2;
     15 
     16     public XListViewHeader(Context context) {
     17         super(context);
     18         initView(context);
     19     }
     20 
     21     /**
     22      * @param context
     23      * @param attrs
     24      */
     25     public XListViewHeader(Context context, AttributeSet attrs) {
     26         super(context, attrs);
     27         initView(context);
     28     }
     29 
     30     private void initView(Context context) {
     31         // 鍒濆�鎯呭喌锛岃�缃�笅鎷夊埛鏂皏iew楂樺害涓?
     32         LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
     33                 LayoutParams.FILL_PARENT, 0);
     34         mContainer = (LinearLayout) LayoutInflater.from(context).inflate(
     35                 R.layout.xlistview_header, null);
     36         addView(mContainer, lp);
     37         setGravity(Gravity.BOTTOM);
     38 
     39         mArrowImageView = (ImageView)findViewById(R.id.xlistview_header_arrow);
     40         mHintTextView = (TextView)findViewById(R.id.xlistview_header_hint_textview);
     41         mProgressBar = (ProgressBar)findViewById(R.id.xlistview_header_progressbar);
     42         
     43         mRotateUpAnim = new RotateAnimation(0.0f, -180.0f,
     44                 Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
     45                 0.5f);
     46         mRotateUpAnim.setDuration(ROTATE_ANIM_DURATION);
     47         mRotateUpAnim.setFillAfter(true);
     48         mRotateDownAnim = new RotateAnimation(-180.0f, 0.0f,
     49                 Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
     50                 0.5f);
     51         mRotateDownAnim.setDuration(ROTATE_ANIM_DURATION);
     52         mRotateDownAnim.setFillAfter(true);
     53     }
     54 
     55     public void setState(int state) {
     56         if (state == mState) return ;
     57         
     58         if (state == STATE_REFRESHING) {    // 鏄剧ず杩涘害
     59             mArrowImageView.clearAnimation();
     60             mArrowImageView.setVisibility(View.INVISIBLE);
     61             mProgressBar.setVisibility(View.VISIBLE);
     62         } else {    // 鏄剧ず绠�ご鍥剧墖
     63             mArrowImageView.setVisibility(View.VISIBLE);
     64             mProgressBar.setVisibility(View.INVISIBLE);
     65         }
     66         
     67         switch(state){
     68         case STATE_NORMAL:
     69             if (mState == STATE_READY) {
     70                 mArrowImageView.startAnimation(mRotateDownAnim);
     71             }
     72             if (mState == STATE_REFRESHING) {
     73                 mArrowImageView.clearAnimation();
     74             }
     75             mHintTextView.setText(R.string.xlistview_header_hint_normal);
     76             break;
     77         case STATE_READY:
     78             if (mState != STATE_READY) {
     79                 mArrowImageView.clearAnimation();
     80                 mArrowImageView.startAnimation(mRotateUpAnim);
     81                 mHintTextView.setText(R.string.xlistview_header_hint_ready);
     82             }
     83             break;
     84         case STATE_REFRESHING:
     85             mHintTextView.setText(R.string.xlistview_header_hint_loading);
     86             break;
     87             default:
     88         }
     89         
     90         mState = state;
     91     }
     92     
     93     public void setVisiableHeight(int height) {
     94         if (height < 0)
     95             height = 0;
     96         LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mContainer
     97                 .getLayoutParams();
     98         lp.height = height;
     99         mContainer.setLayoutParams(lp);
    100     }
    101 
    102     public int getVisiableHeight() {
    103         return mContainer.getHeight();
    104     }
    listview_header

    后台通过状态的改变,控制header的高度。

    3.xlistview

    xlistview是对listview控件的重写

      1 public class XListView extends ListView implements OnScrollListener {
      2 
      3     private float mLastY = -1; // save event y
      4     private Scroller mScroller; // used for scroll back
      5     private OnScrollListener mScrollListener; // user's scroll listener
      6 
      7     // the interface to trigger refresh and load more.
      8     private IXListViewListener mListViewListener;
      9 
     10     // -- header view
     11     private XListViewHeader mHeaderView;
     12     // header view content, use it to calculate the Header's height. And hide it
     13     // when disable pull refresh.
     14     private RelativeLayout mHeaderViewContent;
     15     private TextView mHeaderTimeView;
     16     private int mHeaderViewHeight; // header view's height
     17     private boolean mEnablePullRefresh = true;
     18     private boolean mPullRefreshing = false; // is refreashing.
     19 
     20     // -- footer view
     21     private XListViewFooter mFooterView;
     22     private boolean mEnablePullLoad;
     23     private boolean mPullLoading;
     24     private boolean mIsFooterReady = false;
     25 
     26     // total list items, used to detect is at the bottom of listview.
     27     private int mTotalItemCount;
     28 
     29     // for mScroller, scroll back from header or footer.
     30     private int mScrollBack;
     31     private final static int SCROLLBACK_HEADER = 0;
     32     private final static int SCROLLBACK_FOOTER = 1;
     33 
     34     private final static int SCROLL_DURATION = 400; // scroll back duration
     35     private final static int PULL_LOAD_MORE_DELTA = 50; // when pull up >= 50px
     36                                                         // at bottom, trigger
     37                                                         // load more.
     38     private final static float OFFSET_RADIO = 1.8f; // support iOS like pull
     39                                                     // feature.
     40 
     41     /**
     42      * @param context
     43      */
     44     public XListView(Context context) {
     45         super(context);
     46         initWithContext(context);
     47     }
     48 
     49     public XListView(Context context, AttributeSet attrs) {
     50         super(context, attrs);
     51         initWithContext(context);
     52     }
     53 
     54     public XListView(Context context, AttributeSet attrs, int defStyle) {
     55         super(context, attrs, defStyle);
     56         initWithContext(context);
     57     }
     58 
     59     private void initWithContext(Context context) {
     60         mScroller = new Scroller(context, new DecelerateInterpolator());
     61         // XListView need the scroll event, and it will dispatch the event to
     62         // user's listener (as a proxy).
     63         super.setOnScrollListener(this);
     64 
     65         // init header view
     66         mHeaderView = new XListViewHeader(context);
     67         mHeaderViewContent = (RelativeLayout) mHeaderView
     68                 .findViewById(R.id.xlistview_header_content);
     69         mHeaderTimeView = (TextView) mHeaderView
     70                 .findViewById(R.id.xlistview_header_time);
     71         addHeaderView(mHeaderView);
     72 
     73         // init footer view
     74         mFooterView = new XListViewFooter(context);
     75 
     76         // init header height
     77         mHeaderView.getViewTreeObserver().addOnGlobalLayoutListener(
     78                 new OnGlobalLayoutListener() {
     79                     @SuppressWarnings("deprecation")
     80                     @Override
     81                     public void onGlobalLayout() {
     82                         mHeaderViewHeight = mHeaderViewContent.getHeight();
     83                         getViewTreeObserver()
     84                                 .removeGlobalOnLayoutListener(this);
     85                     }
     86                 });
     87     }
     88 
     89     @Override
     90     public void setAdapter(ListAdapter adapter) {
     91         // make sure XListViewFooter is the last footer view, and only add once.
     92         if (mIsFooterReady == false) {
     93             mIsFooterReady = true;
     94             addFooterView(mFooterView);
     95         }
     96         super.setAdapter(adapter);
     97     }
     98 
     99     /**
    100      * enable or disable pull down refresh feature.
    101      * 
    102      * @param enable
    103      */
    104     public void setPullRefreshEnable(boolean enable) {
    105         mEnablePullRefresh = enable;
    106         if (!mEnablePullRefresh) { // disable, hide the content
    107             mHeaderViewContent.setVisibility(View.INVISIBLE);
    108         } else {
    109             mHeaderViewContent.setVisibility(View.VISIBLE);
    110         }
    111     }
    112 
    113     /**
    114      * enable or disable pull up load more feature.
    115      * 
    116      * @param enable
    117      */
    118     public void setPullLoadEnable(boolean enable) {
    119         mEnablePullLoad = enable;
    120         if (!mEnablePullLoad) {
    121             mFooterView.hide();
    122             mFooterView.setOnClickListener(null);
    123         } else {
    124             mPullLoading = false;
    125             mFooterView.show();
    126             mFooterView.setState(XListViewFooter.STATE_NORMAL);
    127             // both "pull up" and "click" will invoke load more.
    128             mFooterView.setOnClickListener(new OnClickListener() {
    129                 @Override
    130                 public void onClick(View v) {
    131                     startLoadMore();
    132                 }
    133             });
    134         }
    135     }
    136 
    137     /**
    138      * stop refresh, reset header view.
    139      */
    140     public void stopRefresh() {
    141         if (mPullRefreshing == true) {
    142             mPullRefreshing = false;
    143             resetHeaderHeight();
    144         }
    145     }
    146 
    147     /**
    148      * stop load more, reset footer view.
    149      */
    150     public void stopLoadMore() {
    151         if (mPullLoading == true) {
    152             mPullLoading = false;
    153             mFooterView.setState(XListViewFooter.STATE_NORMAL);
    154         }
    155     }
    156 
    157     /**
    158      * set last refresh time
    159      * 
    160      * @param time
    161      */
    162     public void setRefreshTime(String time) {
    163         mHeaderTimeView.setText(time);
    164     }
    165 
    166     private void invokeOnScrolling() {
    167         if (mScrollListener instanceof OnXScrollListener) {
    168             OnXScrollListener l = (OnXScrollListener) mScrollListener;
    169             l.onXScrolling(this);
    170         }
    171     }
    172 
    173     private void updateHeaderHeight(float delta) {
    174         mHeaderView.setVisiableHeight((int) delta
    175                 + mHeaderView.getVisiableHeight());
    176         if (mEnablePullRefresh && !mPullRefreshing) { // 鏈��浜庡埛鏂扮姸鎬侊紝鏇存柊绠�ご
    177             if (mHeaderView.getVisiableHeight() > mHeaderViewHeight) {
    178                 mHeaderView.setState(XListViewHeader.STATE_READY);
    179             } else {
    180                 mHeaderView.setState(XListViewHeader.STATE_NORMAL);
    181             }
    182         }
    183         setSelection(0); // scroll to top each time
    184     }
    185 
    186     /**
    187      * reset header view's height.
    188      */
    189     private void resetHeaderHeight() {
    190         int height = mHeaderView.getVisiableHeight();
    191         if (height == 0) // not visible.
    192             return;
    193         // refreshing and header isn't shown fully. do nothing.
    194         if (mPullRefreshing && height <= mHeaderViewHeight) {
    195             return;
    196         }
    197         int finalHeight = 0; // default: scroll back to dismiss header.
    198         // is refreshing, just scroll back to show all the header.
    199         if (mPullRefreshing && height > mHeaderViewHeight) {
    200             finalHeight = mHeaderViewHeight;
    201         }
    202         mScrollBack = SCROLLBACK_HEADER;
    203         mScroller.startScroll(0, height, 0, finalHeight - height,
    204                 SCROLL_DURATION);
    205         // trigger computeScroll
    206         invalidate();
    207     }
    208 
    209     private void updateFooterHeight(float delta) {
    210         int height = mFooterView.getBottomMargin() + (int) delta;
    211         if (mEnablePullLoad && !mPullLoading) {
    212             if (height > PULL_LOAD_MORE_DELTA) { // height enough to invoke load
    213                                                     // more.
    214                 mFooterView.setState(XListViewFooter.STATE_READY);
    215             } else {
    216                 mFooterView.setState(XListViewFooter.STATE_NORMAL);
    217             }
    218         }
    219         mFooterView.setBottomMargin(height);
    220 
    221         // setSelection(mTotalItemCount - 1); // scroll to bottom
    222     }
    223 
    224     private void resetFooterHeight() {
    225         int bottomMargin = mFooterView.getBottomMargin();
    226         if (bottomMargin > 0) {
    227             mScrollBack = SCROLLBACK_FOOTER;
    228             mScroller.startScroll(0, bottomMargin, 0, -bottomMargin,
    229                     SCROLL_DURATION);
    230             invalidate();
    231         }
    232     }
    233 
    234     private void startLoadMore() {
    235         mPullLoading = true;
    236         mFooterView.setState(XListViewFooter.STATE_LOADING);
    237         if (mListViewListener != null) {
    238             mListViewListener.onLoadMore();
    239         }
    240     }
    241 
    242     @Override
    243     public boolean onTouchEvent(MotionEvent ev) {
    244         if (mLastY == -1) {
    245             mLastY = ev.getRawY();
    246         }
    247 
    248         switch (ev.getAction()) {
    249         case MotionEvent.ACTION_DOWN:
    250             mLastY = ev.getRawY();
    251             break;
    252         case MotionEvent.ACTION_MOVE:
    253             final float deltaY = ev.getRawY() - mLastY;
    254             mLastY = ev.getRawY();
    255             System.out.println(getFirstVisiblePosition() + "---->"
    256                     + getLastVisiblePosition());
    257             if (getFirstVisiblePosition() == 0
    258                     && (mHeaderView.getVisiableHeight() > 0 || deltaY > 0)) {
    259                 // the first item is showing, header has shown or pull down.
    260                 updateHeaderHeight(deltaY / OFFSET_RADIO);
    261                 invokeOnScrolling();
    262             } else if (getLastVisiblePosition() == mTotalItemCount - 1
    263                     && (mFooterView.getBottomMargin() > 0 || deltaY < 0)) {
    264                 // last item, already pulled up or want to pull up.
    265                 updateFooterHeight(-deltaY / OFFSET_RADIO);
    266             }
    267             break;
    268         default:
    269             mLastY = -1; // reset
    270             if (getFirstVisiblePosition() == 0) {
    271                 // invoke refresh
    272                 if (mEnablePullRefresh
    273                         && mHeaderView.getVisiableHeight() > mHeaderViewHeight) {
    274                     mPullRefreshing = true;
    275                     mHeaderView.setState(XListViewHeader.STATE_REFRESHING);
    276                     if (mListViewListener != null) {
    277                         mListViewListener.onRefresh();
    278                     }
    279                 }
    280                 resetHeaderHeight();
    281             }
    282             if (getLastVisiblePosition() == mTotalItemCount - 1) {
    283                 // invoke load more.
    284                 if (mEnablePullLoad
    285                         && mFooterView.getBottomMargin() > PULL_LOAD_MORE_DELTA) {
    286                     startLoadMore();
    287                 }
    288                 resetFooterHeight();
    289             }
    290             break;
    291         }
    292         return super.onTouchEvent(ev);
    293     }
    294 
    295     @Override
    296     public void computeScroll() {
    297         if (mScroller.computeScrollOffset()) {
    298             if (mScrollBack == SCROLLBACK_HEADER) {
    299                 mHeaderView.setVisiableHeight(mScroller.getCurrY());
    300             } else {
    301                 mFooterView.setBottomMargin(mScroller.getCurrY());
    302             }
    303             postInvalidate();
    304             invokeOnScrolling();
    305         }
    306         super.computeScroll();
    307     }
    308 
    309     @Override
    310     public void setOnScrollListener(OnScrollListener l) {
    311         mScrollListener = l;
    312     }
    313 
    314     @Override
    315     public void onScrollStateChanged(AbsListView view, int scrollState) {
    316         if (mScrollListener != null) {
    317             mScrollListener.onScrollStateChanged(view, scrollState);
    318         }
    319     }
    320 
    321     @Override
    322     public void onScroll(AbsListView view, int firstVisibleItem,
    323             int visibleItemCount, int totalItemCount) {
    324         // send to user's listener
    325         mTotalItemCount = totalItemCount;
    326         if (mScrollListener != null) {
    327             mScrollListener.onScroll(view, firstVisibleItem, visibleItemCount,
    328                     totalItemCount);
    329         }
    330     }
    331 
    332     public void setXListViewListener(IXListViewListener l) {
    333         mListViewListener = l;
    334     }
    335 
    336     /**
    337      * you can listen ListView.OnScrollListener or this one. it will invoke
    338      * onXScrolling when header/footer scroll back.
    339      */
    340     public interface OnXScrollListener extends OnScrollListener {
    341         public void onXScrolling(View view);
    342     }
    343 
    344     /**
    345      * implements this interface to get refresh/load more event.
    346      */
    347     public interface IXListViewListener {
    348         public void onRefresh();
    349 
    350         public void onLoadMore();
    351     }
    352 }
    xlistview

    在xlistview中定义了一个事件接口,来监听加载和刷新。

    4.mainactivity

     1 protected void onCreate(Bundle savedInstanceState) {
     2         super.onCreate(savedInstanceState);
     3         setContentView(R.layout.activity_main);
     4         handler=new Handler();
     5         sqlhelper=new SQLiteHelper(MainActivity.this, "test", null, 1);
     6         list=new ArrayList<PersonInfo>();
     7         getData();
     8         listview=(XListView)findViewById(R.id.listView1);
     9         registerForContextMenu(listview);
    10         listview.setPullLoadEnable(true);
    11         // View moreview=getLayoutInflater().inflate(R.layout.moredata, null);
    12         //listview.addFooterView(moreview);
    13          adapter=new MyAdapter(this);
    14         listview.setAdapter(adapter);
    15         listview.setXListViewListener(this);
    16         listview.setOnItemLongClickListener(new OnItemLongClickListener() {
    17             @Override
    18             public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
    19                     int arg2, long arg3) {
    20                 // TODO Auto-generated method stub
    21                 PersonInfo person=list.get(arg2);
    22                  delname=person.getName();
    23                 return false;
    24             }
    25         });
    26        
    27         /* btnpro=(Button)moreview.findViewById(R.id.bt_load);
    28          pg=(ProgressBar)moreview.findViewById(R.id.pg);
    29         btnpro.setOnClickListener(new View.OnClickListener() {
    30             
    31             @Override
    32             public void onClick(View v) {
    33                 // TODO Auto-generated method stub
    34                 pg.setVisibility(View.VISIBLE);// 将进度条可见
    35                    btnpro.setVisibility(View.GONE);// 按钮不可见
    36                     Handler hanldre=new Handler();
    37                     hanldre.postDelayed(new Runnable(){
    38 
    39                         @Override
    40                         public void run() {
    41                             // TODO Auto-generated method stub
    42                             
    43                             adapter.count+=5;
    44                             
    45                              btnpro.setVisibility(View.VISIBLE);
    46                                pg.setVisibility(View.GONE);
    47                                if(adapter.count>list.size())
    48                                    
    49                                {
    50                                    adapter. count=list.size();
    51                                    btnpro.setVisibility(View.INVISIBLE);
    52                                }
    53                                 adapter.notifyDataSetChanged();
    54                         }}, 2000);
    55             }
    56         });*/
    57     
    58     }
    59     private void getData()
    60     {
    61         Cursor cur=sqlhelper.getReadableDatabase().query("person", null, null, null, null, null, null);
    62         if(cur.moveToFirst())
    63         {
    64             while(cur.moveToNext())
    65             {
    66             PersonInfo person=new PersonInfo();
    67             person.name=cur.getString(cur.getColumnIndex("name"));
    68             person.age=cur.getInt(cur.getColumnIndex("age"));
    69             list.add(person);
    70             }
    71         }
    72     }
    73     private void onLoad() {
    74         listview.stopRefresh();
    75         listview.stopLoadMore();
    76         SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss"); 
    77     String    strTime = timeFormat.format(new java.util.Date());  
    78         listview.setRefreshTime(strTime);
    79     }
    oncreate
     1     @Override
     2     public void onRefresh() {
     3         // TODO Auto-generated method stub
     4         handler.postDelayed(new Runnable(){
     5 
     6             @Override
     7             public void run() {
     8                 // TODO Auto-generated method stub
     9                 if(list!=null &&list.size()>0)
    10                 {
    11                     list.clear();
    12                     getData();
    13                     adapter.notifyDataSetChanged();
    14                     onLoad();
    15                 }
    16             }}, 2000);
    17     }
    18     @Override
    19     public void onLoadMore() {
    20         // TODO Auto-generated method stub
    21 
    22         handler.postDelayed(new Runnable(){
    23 
    24             @Override
    25             public void run() {
    26                 // TODO Auto-generated method stub
    27                 adapter.count+=5;
    28                 
    29                    if(adapter.count>list.size())
    30                        
    31                    {
    32                        adapter. count=list.size();
    33                    }
    34                     adapter.notifyDataSetChanged();
    35                     onLoad();
    36             }}, 2000);
    37     }
    onloadmore

    刷新和加载都是新建了一个handler。在handler中执行。

    5.demo

  • 相关阅读:
    Kubernetes 集成研发笔记
    Rust 1.44.0 发布
    Rust 1.43.0 发布
    PAT 甲级 1108 Finding Average (20分)
    PAT 甲级 1107 Social Clusters (30分)(并查集)
    PAT 甲级 1106 Lowest Price in Supply Chain (25分) (bfs)
    PAT 甲级 1105 Spiral Matrix (25分)(螺旋矩阵,简单模拟)
    PAT 甲级 1104 Sum of Number Segments (20分)(有坑,int *int 可能会溢出)
    java 多线程 26 : 线程池
    OpenCV_Python —— (4)形态学操作
  • 原文地址:https://www.cnblogs.com/ggz19/p/3897478.html
Copyright © 2011-2022 走看看