android ui listview 下拉刷新,上滑动刷新效果

来源:互联网 发布:小组网络研修计划 编辑:程序博客网 时间:2024/05/01 09:56

备注:本文章是借鉴网上的很多下拉刷新的效果,自己充分理解和处理,也做了上滑动刷新效果,大家可以借鉴指正。

1)  xml中listview的设置。因为是在代码中实现的listview,所以必须这样设置。

    <com.oic.contract.ui.RTPullListView                                   android:id="@+id/sms_listviews"                                   android:layout_width="match_parent"                                   android:layout_height="wrap_content"                                   android:background="@drawable/sms_list_all"                                                android:divider="@color/baseline"                                                android:dividerHeight="1dp"                                                     android:fadeScrollbars="false"                                               android:fastScrollEnabled= "false"                                               android:cacheColorHint="#00000000"                                               android:scrollbars="none"                                                                     /> 


2)  代码中动态实现页面展示,一定要定义此类型的:

RTPullListView listview;

3)  主要就是状态的设置,根据手势变化来进行显示和隐藏foot.或者head布局。主要理解ontouchevent方法就可以了。其中三种情况的处理。

   

public boolean onTouchEvent(MotionEventevent) {                   if(isRefreshable) {                            switch(event.getAction()) {                            case MotionEvent.ACTION_DOWN:                                     if(visibleLastIndex > 0 && !isRecored) {                                               isRecored= true;                                               isPush= true;                                               startY= (int) event.getY();                                               Log.v(TAG,"在down时候记录当前位置‘");                                     }                                     break;                            case MotionEvent.ACTION_UP:                                     if(state != REFRESHING && state != LOADING) {                                               if(state == DONE) {                                                        //什么都不做                                               }                                               if(state == PULL_To_REFRESH) {                                                        state= DONE;                                                        changeHeaderViewByState();                                                         Log.v(TAG,"由下拉刷新状态,到done状态");                                               }                                               if(state == RELEASE_To_REFRESH) {                                                        state= REFRESHING;                                                        changeHeaderViewByState();                                                        onRefresh();                                                         Log.v(TAG,"由松开刷新状态,到done状态");                                               }                                     }                                      isRecored= false;                                     isBack= false;                                      break;                             case MotionEvent.ACTION_MOVE:                                     inttempY = (int) event.getY();                                      if(!isRecored && visibleLastIndex>0 ) {                                               Log.v(TAG,"在move时候记录下位置");                                               isRecored= true;                                               startY= tempY;                                     }                                      if(state != REFRESHING && isRecored && state != LOADING) {                                                //保证在设置padding的过程中,当前的位置一直是在head,否则如果当列表超出屏幕的话,当在上推的时候,列表会同时进行滚动                                                //可以松手去刷新了                                               if(state == RELEASE_To_REFRESH) {                                                         setSelection(visibleLastIndex);                                                         //往上推了,推到了屏幕足够掩盖head的程度,但是还没有推到全部掩盖的地步                                                        if(((startY-tempY) / RATIO < headContentHeight)                                                                           &&(startY-tempY ) > 0) {                                                                 state= PULL_To_REFRESH;                                                                 changeHeaderViewByState();                                                                  Log.v(TAG,"由松开刷新状态转变到下拉刷新状态");                                                        }                                                        //一下子推到顶了                                                        elseif (startY-tempY  <= 0) {                                                                 state= DONE;                                                                 changeHeaderViewByState();                                                                  Log.v(TAG,"由松开刷新状态转变到done状态");                                                        }                                                        //往下拉了,或者还没有上推到屏幕顶部掩盖head的地步                                                        else{                                                                 //不用进行特别的操作,只用更新paddingTop的值就行了                                                        }                                               }                                               //还没有到达显示松开刷新的时候,DONE或者是PULL_To_REFRESH状态                                               if(state == PULL_To_REFRESH) {                                                         setSelection(visibleLastIndex);                                                         //下拉到可以进入RELEASE_TO_REFRESH的状态                                                        if((startY-tempY ) / RATIO >= headContentHeight) {                                                                 state= RELEASE_To_REFRESH;                                                                 isBack= true;                                                                 changeHeaderViewByState();                                                                 Log.v(TAG,"由done或者下拉刷新状态转变到松开刷新");                                                        }                                                        //上推到顶了                                                        elseif (startY-tempY <= 0) {                                                                 state= DONE;                                                                 changeHeaderViewByState();                                                                 isPush= false;                                                                 Log.v(TAG,"由DOne或者下拉刷新状态转变到done状态");                                                        }                                               }                                                //done状态下                                               if(state == DONE) {                                                        if(startY-tempY > 0) {                                                                 state= PULL_To_REFRESH;                                                                 changeHeaderViewByState();                                                        }                                               }                                                //更新headView的size                                               if(state == PULL_To_REFRESH) {                                                        headView.setPadding(0,0, 0, -1 * headContentHeight                                                                           +( startY-tempY ) / RATIO);                                                }                                               //更新headView的paddingTop                                               if(state == RELEASE_To_REFRESH) {                                                        headView.setPadding(0,0, 0, (startY-tempY ) / RATIO                                                                           -headContentHeight);                                               }                                     }                                      break;                            }                   }                    //returntrue ;                            returnsuper.onTouchEvent(event);         }

 分析:因为要做成向上滑动效果,所以还要注意以下几点:

1)明白滑动的几个事件关系。

2)更新headView的paddingTop,要改成。更新footView的paddingBottom.自己要根据参数处理。

核心代码下载:http://download.csdn.net/detail/self_discipline1/7493133



0 0