项目实战:新闻APPday04学习笔记
不否认努力,继续加油!
学习整理重点、盲区,笔记如下:干干巴巴,麻麻赖赖,一点都不圆润……
day04
内容
1. 顶部新闻轮播图事件处理
-
自定义类 HorizontalScrollViewPager 要求父类不拦截事件;
a. 存在的 BUG;选中第一个选项卡;而顶部 ViewPager 的新闻轮播图不在首页时;此时向右滑动,理论应该滑动的是顶部 ViewPager 的新闻;而实际上确实抽出了菜单;
b.自定义 HorizontalScrollViewPager
//在 dispatchTouchEvent() 中请求父层视图不拦截,当前控件的事件 getParent().requestDisallowInterceptTouchEvent(true);
c. 新的BUG;拦截后,顶部 ViewPager 的新闻轮播图滑在尾页时,也不能滑动;此时要对事件进行处理;
-
处理滑动事件;让父亲控件不拦截当前控件的事件;
a.上下拖动时,父元素可以拦截当前事件;
b.左右拖动时,不可用拦截事件;
c.如果当前ViewPager是第0页面并且是从左向右滑动,拦截;
d.如果当前ViewPager是最后页面并且是从右向右滑左,拦截;
2. 自定义下拉刷新(touch事件处理)
-
自定义类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); }
-
拖动实现隐藏和显示头部控件
a. 重写onTouchEvent() 在down startY;
b. 计算滑动的距离
float distanceY = endY - startY;
int paddingTop = -控件高 + distanceY; View.setPadding(0,paddingTop,0,0);//动态的显示下拉刷新控件c. 设置效果
在手指按下时;检测是否向下拉动屏幕,检测当前状态:如果不是下拉刷新,就设置其状态为下拉刷新并更新 View,设置动画;
响应的设置 释放刷新;
在手指离开屏幕时,设置状态和对应的画面,设置会调接口;
3. 下拉刷新松开处理和接口的定义
-
刷新的效果的实现
-
下拉刷新松开处理和接口的定义
a. 定义下拉刷新接口;
b. 定义接口实现类;
c. 设置监听并在监听中设置请求数据的方法,并且更新时间;
4. 自定义ListView(加载更多)
-
添加加载更多布局
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);
-
拖动到底部的时候显示加载更多布局
a. 设置监听,在 onScrollStateChanged() 中判断,是否加载到最后一条数据;
b. 当加载到最后一条时,显示 该视图;并回调加载更多的方法;
-
判断完整显示轮播图分析
a. 此时存在BUG:当列表在更多数据位置时,稍微向下滑动,就会直接返回到顶部进行刷新操作;
b. 解题思路:当顶部的轮播图新闻页完全显示时,向下滑动才进行刷新操作;如果不能完全显示轮播图,就执行 ListView 的向上滚动;
-
判断轮播图是否完全显示
a. 获取 轮播图 和 ListView 的Y坐标,如果轮播图的坐标 ≥ 对方的Y坐标时,才进行刷新操作;
b. 如果不是完全显示时,在滑动时直接 break;而不进行刷新操作;
c. 误以为是事件冲突,其实不是;
5. 把下拉刷新抽取成第三方库并且使用
- 新建 module;
- 把代码、布局等文件添加进来;
- 依赖并使用;
- 写一个案例,方便其他用户理解使用
6. PullToRefresh下拉刷新的使用
-
PullToRefresh简介
PullToRefresh是一套实现下拉刷新库,它支持:1. ListView;2.ExpandableListView;3. GridView;4.WebView;5. ScrollView;6. HorizontalScrollView;7. ViewPager
-
PullToRefresh集成
a. 关联库PullToRefresh库
b.把新闻详情页面的代码拷贝到专题详情页面
c.把TabDetailPager代码复制重新创建新类TopicTabDetailPager
d.布局文件新增加topic_tab_detailpager.xml,并引用案例中需要的布局;
e. 实例化,并在 initView 方法中设置监听和添加头部
f. 设置回调完成等
盲区
- 本博客根据尚硅谷项目实战: 北京新闻.学习整理;
其他笔记
新闻APP其他笔记
- day01
第一天的学习笔记: 新闻APP01. - day02
第二天的学习笔记: 新闻APP02. - day03
第三天的学习笔记: 新闻APP03. - day04
第四天的学习笔记: 新闻APP04. - day05
第五天的学习笔记: 新闻APP05. - day06
第六天的学习笔记:新闻APP06. - day07
第七天的学习笔记:新闻APP07.
购物商城APP学习笔记
购物商城APP学习笔记:购物商城