Android开发学习笔记-下拉刷新的实现

百度出来的感觉不明觉厉好深奥….自己整理了一下思路实现了..

主要思路

OnTouch监听器

通过getRawY来判断是否正在下拉及处理事件

HeaderLayout

作于下拉头的Layout,通过setLayoutParams动态设置Height

ListView

要判断是否处于最顶部

实现

新建一个布局…包含一个ListView和一个headerLayout,将header设置为gone,不显示出来;


    
        
    




然后就该上代码了,备注应该够详细了….

public class domeView extends LinearLayout implements OnTouchListener{
    float currentY=0; //这是当前触摸的Y坐标
    float downY = 999999;  //这是开始触摸的Y坐标
    ListView list;  //ListView
    RelativeLayout header;  //HeaderLayout 下拉头
    TextView text; // 下拉头里的View
    int headerMaxHeight = 200;  //下拉头最大高度
    public domeView(Context context, AttributeSet attrs) {
        super(context, attrs);
        LayoutInflater.from(context).inflate(R.layout.view_dome,this);
            /**
              * 先给ListView里加点数据
              **/
        list = (ListView) findViewById(R.id.HeaderList);
        String[] s = new String[]{"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","2","3","4","5","6","7","8","9","10","11","12","13","14","15"};
        ArrayAdapter adapter = new ArrayAdapter(context,android.R.layout.simple_list_item_1, s);
        if(! isInEditMode()){
            list.setAdapter(adapter);
        }
            /**
              * 因为本身是实现于OnTouchListener接口,所以set this就好了
              **/
        list.setOnTouchListener(this);
        header = (RelativeLayout) findViewById(R.id.HeaderLayout);
        text = (TextView) findViewById(R.id.HeaderText);
    }
    @Override
    /**
      * OnTouch监听事件
      **/
    public boolean onTouch(View v, MotionEvent event) {
        /**
          * event.getAction()是获得当前的触摸状态;
          * ACTION_DOWN是刚触摸屏幕
          * ACTION_MOVE是触摸并移动
          * ACTION_UP是离开触摸
          **/
        switch(event.getAction()){
            case MotionEvent.ACTION_DOWN:
                        /**
                          * getFirstVisiblePosition表示获取ListView上当前屏幕上
                          * 可见的第一个Item序号,然后通过第一个Item的getTop判断
                          * 是否已经在顶部 
                          **/
                if(list.getFirstVisiblePosition() == 0 && list.getChildAt(0).getTop()==0){
                    downY = event.getRawY();//获取第一次触摸的Y坐标
                }
                break;
            case MotionEvent.ACTION_MOVE:
                currentY = event.getRawY(); //获取当前的Y坐标
                            /**
                              * 判断当前坐标是否大于第一次坐标,是则说明正在下
                              * 拉,继续判断是否处于顶部,是才处理事件
                             **/
                if(currentY > downY && list.getFirstVisiblePosition() == 0 && list.getChildAt(0).getTop()==0){
                    int changeHeight = (int) (currentY - downY);
                    changeHeaderHeight((int) (currentY-downY));
                    return true;
                }
                break;
            case MotionEvent.ACTION_UP:

                /**
                 * 这里放刷新数据的处理事件,松手完就要隐藏啦
                 * **/

                changeHeaderHeight(0);
                break;
        }
        return false;
    }
    private void changeHeaderHeight(int height) {
        if(height == 0 && header.getVisibility() != View.GONE){
            header.setVisibility(View.GONE);
            changeHeaderHeight(1);
            return;
            //如果设置为0则表示将header设置为不可视
        }
        if(header.getVisibility() != View.VISIBLE){
            header.setVisibility(View.VISIBLE);
            //更改height的时候要判断现在是否可视..若不可视得将其设置为可视
        }
        if(height > headerMaxHeight){
            //如果要设置的height超过最大的height处理...
            changeHeaderHeight(headerMaxHeight);
            text.setText("松开立刻刷新");
            return;
        }
        else if(height <= 0){
            //值<=0就表示要隐藏啦
            changeHeaderHeight(0);
            return;
        }
        else{
            text.setText("下拉刷新");
        }
        /**
          * 先getLayoutParams修改height再setLayoutParams即可达到修改height的目的
          **/
        android.view.ViewGroup.LayoutParams lp = header.getLayoutParams();
        lp.height = height;
        header.setLayoutParams(lp);
    }
}

效果

最终差不多就是这样的效果..应该差不多了把

http://www.hoimk.com/learn-note/73.html

你可能感兴趣的:(Android)