下拉刷新ListView

来源:互联网 发布:ubuntu lightdm 配置 编辑:程序博客网 时间:2024/06/06 14:00

下拉刷新ListView

1、  创建一个类继承一直ListView:classPullToRefreshListViewextends ListView

2、  在构造方法中添加HeadView:addHeaderView(headView);

3、  获取HeadView的高:
   自定义View常用的方法:onMeasure    onLayout     onDraw

1.        getMeasuredHeight()  在onMeasure方法执行之后才能获取到

2.        getHeight()在onLayout方法执行之后才能获取到值

4、  隐藏headView:headView.setPadding(0,-headViewHeight, 0, 0);

什么时候显示HeadView:当向下滑,且第一条可见item是第0条的时候才需要设置HeadView的paddingTop来显示HeadView


代码:

int fingerMoveDistanceY = (int) (ev.getY() -downY);

if (getFirstVisiblePosition() == 0 && fingerMoveDistanceY> 0) {

int paddingTop = fingerMoveDistanceY -headViewHeight;

   setHeadViewPaddingTop(paddingTop);

  return true//代表自己已经处理了这个事件,不需要使用ListView事件了

}

  6.下拉刷新三种状态的判断

         移动的时候,当paddingTop < 0 的时候,说明HeadView没有完全显示出来,进入下拉刷新状态:

代码

if (paddingTop < 0 && currentState != STATE_PULL_TO_REFRESH) {

   currentState = STATE_PULL_TO_REFRESH;

}

*移动的时候,当paddingTop >= 0 的时候,说明HeadView已经完全显示出来了,进入松开以新状态:


代码:

if (paddingTop >= 0 &&currentState !=STATE_RELEASE_TO_REFRESH) {

   currentState =STATE_RELEASE_TO_REFRESH;

}


手指抬起的时候,且当前状态是松开刷新状态的时候,进入正在刷新状态:

if (currentState ==STATE_RELEASE_TO_REFRESH) {

    currentState = STATE_REFRESHING;

}


  当已经是“正在刷新”状态时,则不允许再做”下拉刷新”和”松开刷新”的操作了,在Move事件中加入如下判断:

 

case MotionEvent.ACTION_MOVE:

       if (currentState ==STATE_REFRESHING) {

//如果已经是正在刷新状态了,则不处理下拉的操作了

        returnsuper.onTouchEvent(ev);

      }


下拉箭头的转动


往上转:0 ~ -180
    往下转:-180 ~ -360


    创建动画类:

private RotateAnimationcreateAnimator(float fromDegrees,float toDegrees) {

int pivotXType =RotateAnimation.RELATIVE_TO_SELF;//设置旋转点X轴参照物

int pivotYType =RotateAnimation.RELATIVE_TO_SELF;//设置旋转点Y轴参照物

float pivotXValue =0.5f;//设置旋转点X轴的位置为View的中心点

float pivotYValue =0.5f;//设置旋转点Y轴的位置为View的中心点

RotateAnimation ra= new RotateAnimation(fromDegrees, toDegrees, pivotXType,

       pivotXValue,pivotYType, pivotYValue);

ra.setDuration(300);  // 设置动画执行时间

ra.setFillAfter(true);//设置动画保持在结束状态

return ra;

}


8、  隐藏箭头的时候要清除动画:iv_arrow.clearAnimation();  如果不隐藏动画效果,设置View.GONE之后还是看得见的。

9、  HeadView显示时,当手指松开时的处理:

a)松开时如果是“正在刷新”状态,则把headVie完全显示

if (currentState ==STATE_REFRESHING) {

   showHeadView();

}

b)松开时如果是“下拉刷新”状态,则把HeadView完全隐藏

if (currentState ==STATE_PULL_TO_REFRESH) {

   hideHeadView();

}


10、  增加FooterView:addFooterView(footerView);

11什么时候显示FooterView呢?当ListView处于空闲状态,并且最后一条可见itemListView中的最后一条数据则显示:

private OnScrollListenermOnScrollListener =new OnScrollListener() {

publicvoidonScrollStateChanged(AbsListView view,int scrollState) {

    if (scrollState == OnScrollListener.SCROLL_STATE_IDLE  //是空闲状态

          &&getLastVisiblePosition() == getCount() - 1      // 最后可见Item不是最后一条数据

          && !loadingMore) {                               //没有做联网加载更多的事情

           loadingMore=true;

       showFooterView();

    }

}

};


12、  FooterView显示出来后,ListView不会自动上滑把FooterView显示出来的,所以需要手动设置:setSelection(getCount() - 1);// 选中最后一条

增加回调监听器


13增加回调监听器

publicinterface OnRefreshingLinstener {

   /**ListView处于刷新状态的时候会调用 */

   void onRefreshing();

   /**ListView处于加载更多的时候会调用 */

   void onLoadMore();

}

选择器问题

如果是给background设置背景,使用drawable类型的选择器

如果是给文字设置颜色,使用color list选择器


SlidingMenu

分析:一个容器(SlidingMenu)中装了两个内容(菜单和主界面),如下:



2、  创建一个类继承于ViewGroup:classSlidingMenuextends ViewGroup

3、 布局实现:

<com.android.slidingmenu.SidingMenu

    android:id="@+id/sidingMenu"

    android:layout_width="match_parent"

    android:layout_height="match_parent">

       

    <includelayout="@layout/menu"/>

    <includelayout="@layout/main"/>

       

</com.android.slidingmenu.SidingMenu>



















       




ViewGroup拥有下面3个Touch相关方法

  dispatchTouchEvent(MotionEvent ev)  用于Touch事件的颁发

  onInterceptTouchEvent(MotionEvent ev) 用于拦截Touch事件

  onTouchEvent(MotionEvent event) 用于处理Touch事件


Activity、View拥有下面2个Touch相关方法

  dispatchTouchEvent(MotionEvent ev)  用于Touch事件的颁发

  onTouchEvent(MotionEvent event) 用于处理Touch事件

 



0 0
原创粉丝点击