文档章节

AutoHomeRefreshListView仿汽车之家下拉刷新 《IT蓝豹》

抉择很难
 抉择很难
发布于 2015/11/02 15:04
字数 719
阅读 124
收藏 2

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

AutoHomeRefreshListView仿汽车之家下拉刷新

AutoHomeRefreshListView 高仿汽车之家下拉刷新 ,下拉的时候出现很不错的效果。
本项目来自:https://github.com/nugongshou110/AutoHomeRefreshListView
首先是自定义AutoHomeListView,继承ListView实现的
重要代码如下:

public class AutoHomeListView extends ListView implements AbsListView.OnScrollListener{
    private static final int DONE = 0;
    private static final int PULL_TO_REFRESH = 1;
    private static final int RELEASE_TO_REFRESH = 2;
    private static final int REFRESHING = 3;
    private static final int RATIO = 4;
    private LinearLayout headerView;
    private AutoHome mAutoHome;
    private int headerViewHeight;
    private float startY;
    private float currentProgress;
    private int currentHeight;
    private float offsetY;
    private TextView tv_pull_to_refresh;
    private OnAutoHomeRefreshListener mOnRefreshListener;
    private int state;
    private int mFirstVisibleItem;
    private boolean isRecord;
    private boolean isEnd;
    private boolean isRefreable;
    private FrameLayout mAnimContainer;
    private PointerView mAutoHomeAnim;
    private Animation animation;


    public AutoHomeListView(Context context) {
        super(context);
        init(context);
    }

    public AutoHomeListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    public AutoHomeListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context);
    }

    public interface OnAutoHomeRefreshListener{
        void onRefresh();
    }
    public void setOnAutoHomeRefreshListener(OnAutoHomeRefreshListener onRefreshListener){
        mOnRefreshListener = onRefreshListener;
        isRefreable = true;
    }
    public void setOnRefreshComplete(){
        isEnd = true;
        state = DONE;
        changeHeaderByState(state);
    }

    private void init(Context context) {
        setOverScrollMode(View.OVER_SCROLL_NEVER);
        setOnScrollListener(this);
        
        headerView = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.autohome_item, null, false);
        mAutoHome = (AutoHome) headerView.findViewById(R.id.auto_home);
        tv_pull_to_refresh = (TextView) headerView.findViewById(R.id.tv_pull_to_refresh);
        mAnimContainer = (FrameLayout) headerView.findViewById(R.id.anim_container);
        mAutoHomeAnim = (PointerView) headerView.findViewById(R.id.anim_pointer);
        
        animation = AnimationUtils.loadAnimation(context, R.anim.pointer_rotate);
        
        measureView(headerView);
        addHeaderView(headerView);
        headerViewHeight = headerView.getMeasuredHeight();
        headerView.setPadding(0, -headerViewHeight, 0, 0);

        state = DONE;
        isEnd = true;
        isRefreable = false;
    }

 

    @Override
    public void onScrollStateChanged(AbsListView absListView, int i) {
    }
    @Override
    public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        mFirstVisibleItem = firstVisibleItem;
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        if (isEnd) {
            if (isRefreable) {
                switch (ev.getAction()){
                case MotionEvent.ACTION_DOWN:
                    if (mFirstVisibleItem == 0 && !isRecord) {
                        isRecord = true;
                        startY = ev.getY();
                    }
                    break;
                case MotionEvent.ACTION_MOVE:
                    float tempY = ev.getY();
                    if (mFirstVisibleItem == 0 && !isRecord) {
                        isRecord = true;
                        startY = tempY;
                    }
                    if (state!=REFRESHING && isRecord ) {
                        offsetY = tempY - startY;
                        float currentHeight = (-headerViewHeight+offsetY/3);
                        float currentProgress = 1+currentHeight/headerViewHeight;
                        if (currentProgress>=1) {
                            currentProgress = 1;
                        }
                        if (state == RELEASE_TO_REFRESH && isRecord) {
                            setSelection(0);
                            if (-headerViewHeight+offsetY/3<0) {
                                state = PULL_TO_REFRESH;
                                changeHeaderByState(state);
                            }else if (offsetY<=0) {
                                state = DONE;
                                changeHeaderByState(state);
                            }
                        }
                        if (state == PULL_TO_REFRESH && isRecord) {
                            setSelection(0);
                            if (-headerViewHeight+offsetY/3>=0) {
                                state = RELEASE_TO_REFRESH;
                                changeHeaderByState(state);
                            }else if (offsetY<=0) {
                                state = DONE;
                                changeHeaderByState(state);
                            }
                        }
                        if (state == DONE && isRecord) {
                            if (offsetY>=0) {
                                state = PULL_TO_REFRESH;
                            }
                        }
                        if (state == PULL_TO_REFRESH) {
                            Log.i("zhangqi", ""+(int)(-headerViewHeight+offsetY/3));
                            headerView.setPadding(0,(int)(-headerViewHeight+offsetY/3) ,0,0);
                            mAutoHome.setCurrentProgress(currentProgress);
                            mAutoHome.postInvalidate();
                        }
                        if (state == RELEASE_TO_REFRESH) {
                            headerView.setPadding(0,(int)(-headerViewHeight+offsetY/3) ,0, 0);
                            mAutoHome.setCurrentProgress(currentProgress);
                            mAutoHome.postInvalidate();
                        }
                    }
                
                    
                    break;
                case MotionEvent.ACTION_UP:
                    if (state == PULL_TO_REFRESH) {
                        this.smoothScrollBy((int)(-headerViewHeight+offsetY/3)+headerViewHeight, 500);
                        changeHeaderByState(state);
                    }
                    if (state == RELEASE_TO_REFRESH) {
                        this.smoothScrollBy((int)(-headerViewHeight+offsetY/3), 500);
                        state = REFRESHING;
                        mOnRefreshListener.onRefresh();
                        changeHeaderByState(state);
                    }
                    isRecord = false;
                    break;
                }
                
            }
        }
        return super.onTouchEvent(ev);
    }
    
    private void changeHeaderByState(int state){
        switch (state) {
        case DONE:
            headerView.setPadding(0, -headerViewHeight, 0, 0);
            mAutoHome.setVisibility(View.VISIBLE);
            mAutoHomeAnim.clearAnimation();
            mAnimContainer.setVisibility(View.GONE);
            break;
        case RELEASE_TO_REFRESH:
            tv_pull_to_refresh.setText("放开刷新");
        
            break;
        case PULL_TO_REFRESH:
            tv_pull_to_refresh.setText("下拉刷新");
            state = DONE;
            mAutoHome.setVisibility(View.VISIBLE);
            mAutoHomeAnim.clearAnimation();
            mAnimContainer.setVisibility(View.GONE);
            break;
        case REFRESHING:
            tv_pull_to_refresh.setText("正在刷新");
            mAutoHome.setVisibility(View.GONE);
            mAnimContainer.setVisibility(View.VISIBLE);
            mAutoHomeAnim.clearAnimation();
            mAutoHomeAnim.startAnimation(animation);
            break;
        default:
            break;
        }
    }
    
    
    private void measureView(View child) {
        ViewGroup.LayoutParams p = child.getLayoutParams();
        if (p == null) {
            p = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.WRAP_CONTENT);
        }
        int childWidthSpec = ViewGroup.getChildMeasureSpec(0, 0 + 0, p.width);
        int lpHeight = p.height;
        int childHeightSpec;
        if (lpHeight > 0) {
            childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight,
                    MeasureSpec.EXACTLY);
        } else {
            childHeightSpec = MeasureSpec.makeMeasureSpec(0,
                    MeasureSpec.UNSPECIFIED);
        }
        child.measure(childWidthSpec, childHeightSpec);
    }


}


//如何调用
        mAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,mDatas);
        mListView = (AutoHomeListView) findViewById(R.id.listview);
        mListView.setAdapter(mAdapter);
        mListView.setOnAutoHomeRefreshListener(this);

 

运行效果:

相关代码


© 著作权归作者所有

抉择很难
粉丝 6
博文 51
码字总数 26157
作品 0
海淀
程序员
私信 提问
MeiTuanRefreshListView高仿美团下拉刷新《IT蓝豹》

MeiTuanRefreshListView高仿美团下拉刷新 MeiTuanRefreshListView高仿美团下拉刷新, 本项目来自:https://github.com/nugongshou110/MeiTuanRefreshListView 项目主要构成部分:自定义MeiTu...

抉择很难
2015/11/05
657
0
简单在线文本编辑器SEditor,仿汽车之家论坛

简单在线文本编辑器SEditor,仿汽车之家论坛 下载地址 http://qiannao.com/file/yxl2/2d806b64/

yxl2
2012/12/17
483
0
android开源项目框架大全:《IT蓝豹》

android开源项目框架大全: 1.多页切换TabHost 9 android-sticky-viewpager ViewPager带有粘性功能,常规的处理方法可能会超级复杂,因为涉及到大量的onTouch监听、拦截,滑动时因为效率问题...

抉择很难
2015/10/20
588
0
android开源项目框架大全:《IT蓝豹》

android开源项目框架大全: 1.多页切换TabHost 9 高仿网易云音乐客户端的Home页面切换Tabhost 高仿网易云音乐客户端的Home页面切换Tabhost,并且三角形是透明的,实现方式,自定义AnimTabsV...

抉择很难
2015/10/20
771
1
仿美团下拉刷新控件(二)

如果想学习更多进阶知识,可以关注我的微信公众号:Android小菜。 也可以直接扫描二维码关注: 转载本专栏文章,请注明出处,尊重原创 。文章博客地址:道龙的博客 本篇是实现仿美团下拉刷新...

qq_32059827
2017/10/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

c++11 auto 与 decltype 详解

一. auto简介 编程时候常常需要把表达式的值付给变量,需要在声明变量的时候清楚的知道变量是什么类型。然而做到这一点并非那么容易(特别是模板中),有时候根本做不到。为了解决这个问题,C++...

天王盖地虎626
今天
5
0
Java中使用ProtoBuf的总结

关于java中使用protobuf的使用方法 1.下载protobuf编译器,这个名字叫protoc,下载地址:https://github.com/protocolbuffers/protobuf/releases 2.编辑proto文件,编辑格式如下: syntax =...

shatian
今天
4
0
OSChina 周一乱弹 —— 我的视频网站vip账号和我厚脸皮的朋友们

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @Cobbage :分享小海的单曲《衡山路(2016现场版)》: 《衡山路(2016现场版)》- 小海 手机党少年们想听歌,请使劲儿戳(这里) @FalconChe...

小小编辑
今天
115
4
Spring Cloud Alibaba 实战(十二) - Nacos配置管理

> 本章主要内容是:使用Nacos管理配置以及实现配置管理的原因,配置如何管理以及动态刷新和最佳实现总结,最后是Nacos配置刷新原理解读 该技术类似于Spring Cloud Config 1 配置管理的意义 项目...

JavaEdge
今天
9
0
面试官问你编码相关的面试题,把这篇甩给他就完事!

前情回顾:Java中一个字符占两字节 但为什么new String("字").getBytes().length 返回3个字节 今天主要聊一聊: 字节 字符 字符集 编码 字符编码 Java 内码和外码 Unicode 字节 例如 :00001...

gzc426
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部