自定义下拉刷新 & 把自定义View抽取成库— Android项目实战—新闻APP04


不否认努力,继续加油!
学习整理重点、盲区,笔记如下:干干巴巴,麻麻赖赖,一点都不圆润……

day04

内容

1. 顶部新闻轮播图事件处理

  1. 自定义类 HorizontalScrollViewPager 要求父类不拦截事件;

    a. 存在的 BUG;选中第一个选项卡;而顶部 ViewPager 的新闻轮播图不在首页时;此时向右滑动,理论应该滑动的是顶部 ViewPager 的新闻;而实际上确实抽出了菜单;

    b.自定义 HorizontalScrollViewPager

    //在 dispatchTouchEvent() 中请求父层视图不拦截,当前控件的事件
    getParent().requestDisallowInterceptTouchEvent(true);
    

    c. 新的BUG;拦截后,顶部 ViewPager 的新闻轮播图滑在尾页时,也不能滑动;此时要对事件进行处理;

  2. 处理滑动事件;让父亲控件不拦截当前控件的事件;

    a.上下拖动时,父元素可以拦截当前事件;

    b.左右拖动时,不可用拦截事件;

    c.如果当前ViewPager是第0页面并且是从左向右滑动,拦截;

    d.如果当前ViewPager是最后页面并且是从右向右滑左,拦截;

2. 自定义下拉刷新(touch事件处理)

  1. 自定义类RefreshListView和布局文件

    a. 自定义类RefreshListView继承ListView;
    并在初始化视图时,将下拉刷新的“头”视图添加到头上;this.addHeaderView(headerView);

    b. 自定义下拉刷新的“头”视图的布局

    c. 自定义ProgressBar样式

    android:innerRadiusRatio="2.5"Float类型。这个值表示内部环的比例,例如,如果android:innerRadiusRatio = " 5 ",那么内部的半径等于环的宽度除以5。这个值会被android:innerRadius重写。 默认值是9。值越大,圆的宽越小。当时1的时候看不到。

    android:thicknessRatio="15" Float类型。厚度的比例。例如,如果android:thicknessRatio= " 2 ",然后厚度等于环的宽度除以2。这个值是被android:innerRadius重写, 默认值是3。值越大,圆环的环越小。

    android:useLevel="false" ,当值设置为true的时候出错隐藏和再次显示。Boolean类型。如果用在 LevelListDrawable里,那么就是true。如果通常不出现则为false。

    <?xml version="1.0" encoding="utf-8"?>
    <rotate xmlns:android="http://schemas.android.com/apk/res/android"
        android:fromDegrees="0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toDegrees="360" >
        <shape
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:innerRadiusRatio="2.5"
            android:shape="ring"
            android:thicknessRatio="15"
            android:useLevel="false" >
            <gradient
                android:centerColor="#33ff0000"
                android:endColor="#ff0000"
                android:startColor="#ffffff"
                android:type="sweep" />
        </shape>
     
    </rotate>
    

    d. 隐藏头部
    这里首先是必须要测量;不测量无法获得自定义 “头” 文件的高;
    其次,参数传0,0没有特殊意义,毫无意义;
    这里用的是将 “头” 布局安装在 负数;也就是不可见,而不是设置可视状态;View.setPadding(0,-控件高,0,0);//完全隐藏;View.setPadding(0,0,0,0);//完全显示;

    public void initHeaderView(Context context){
    	  View headerView = View.inflate(context, R.layout.refresh_listview_header, null);
    	  //测量
    	  headerView.measure(0, 0);
    	  //得到控件的高
    	  int headerViewHeight = headerView.getMeasuredHeight();
    	  //设置填充
    	  headerView.setPadding(0, -headerViewHeight , 0, 0);
    	  this.addHeaderView(headerView);
    }
    
  2. 拖动实现隐藏和显示头部控件

    a. 重写onTouchEvent() 在down startY;

    b. 计算滑动的距离
    float distanceY = endY - startY;
    int paddingTop = -控件高 + distanceY; View.setPadding(0,paddingTop,0,0);//动态的显示下拉刷新控件

    c. 设置效果
    在手指按下时;检测是否向下拉动屏幕,检测当前状态:如果不是下拉刷新,就设置其状态为下拉刷新并更新 View,设置动画;
    响应的设置 释放刷新;
    在手指离开屏幕时,设置状态和对应的画面,设置会调接口;

3. 下拉刷新松开处理和接口的定义

  1. 刷新的效果的实现

  2. 下拉刷新松开处理和接口的定义

    a. 定义下拉刷新接口;

    b. 定义接口实现类;

    c. 设置监听并在监听中设置请求数据的方法,并且更新时间;

4. 自定义ListView(加载更多)

  1. 添加加载更多布局

    a. 设置 “加载更多” 布局xml文件;

    b. 代码中初始化,并设置默认隐藏;

    View footerView = View.inflate(context, R.layout.refresh_listview_footer, null); 
    //隐藏代码
    footerView.measure(0, 0);
    int footerViewHeight = footerView.getMeasuredHeight();
    footerView.setPadding(0, -footerViewHeight, 0, 0);
    this.addFooterView(footerView);
    
  2. 拖动到底部的时候显示加载更多布局

    a. 设置监听,在 onScrollStateChanged() 中判断,是否加载到最后一条数据;

    b. 当加载到最后一条时,显示 该视图;并回调加载更多的方法;

  3. 判断完整显示轮播图分析

    a. 此时存在BUG:当列表在更多数据位置时,稍微向下滑动,就会直接返回到顶部进行刷新操作;

    b. 解题思路:当顶部的轮播图新闻页完全显示时,向下滑动才进行刷新操作;如果不能完全显示轮播图,就执行 ListView 的向上滚动;

  4. 判断轮播图是否完全显示

    a. 获取 轮播图 和 ListView 的Y坐标,如果轮播图的坐标 ≥ 对方的Y坐标时,才进行刷新操作;

    b. 如果不是完全显示时,在滑动时直接 break;而不进行刷新操作;

    c. 误以为是事件冲突,其实不是;

5. 把下拉刷新抽取成第三方库并且使用

  1. 新建 module;
  2. 把代码、布局等文件添加进来;
  3. 依赖并使用;
  4. 写一个案例,方便其他用户理解使用

6. PullToRefresh下拉刷新的使用

  1. PullToRefresh简介

    PullToRefresh是一套实现下拉刷新库,它支持:1. ListView;2.ExpandableListView;3. GridView;4.WebView;5. ScrollView;6. HorizontalScrollView;7. ViewPager

  2. PullToRefresh集成

    a. 关联库PullToRefresh库

    b.把新闻详情页面的代码拷贝到专题详情页面

    c.把TabDetailPager代码复制重新创建新类TopicTabDetailPager

    d.布局文件新增加topic_tab_detailpager.xml,并引用案例中需要的布局;

    e. 实例化,并在 initView 方法中设置监听和添加头部
    f. 设置回调完成等

盲区

  1. 本博客根据尚硅谷项目实战: 北京新闻.学习整理;

其他笔记

新闻APP其他笔记

  1. day01
    第一天的学习笔记: 新闻APP01.
  2. day02
    第二天的学习笔记: 新闻APP02.
  3. day03
    第三天的学习笔记: 新闻APP03.
  4. day04
    第四天的学习笔记: 新闻APP04.
  5. day05
    第五天的学习笔记: 新闻APP05.
  6. day06
    第六天的学习笔记:新闻APP06.
  7. day07
    第七天的学习笔记:新闻APP07.

购物商城APP学习笔记

购物商城APP学习笔记:购物商城

猜你喜欢

转载自blog.csdn.net/liusaisaiV1/article/details/105935887