• 智慧北京03_菜单详情页_ViewPagerIndicator框架_页签详情页_事件处理


    1,新闻菜单详情页,初始化标签页面

     

    这是新闻菜单详情页的内容,不考虑导航栏的情况下,下面是一个ViewPager.

    创建新闻菜单详情页的布局,创建ViewPager

    创建ViewPager适配器

    重点在初始化item,instantiateItem()

    观察可知,其实在这几个Pager的内容基本一样,所以只需要创建一个对象类(页签)就行

    这个类继承BaseMenuDetailPager(是否继承这个类不是重点,主要是不需要再创建一个类去写initView(),initData()方法)

    初始化这个页签在NewsMenuPagerinitData()中进行初始化

    初始化页签要根据网络返回的数据,拿到页签的数量

    新闻中心把数据传递给菜单详情页>>>在创建菜单详情页集合的时候,把解析网络的children数据,通过构造传递过去(更改构造参数就是了)

    然后在具体的新闻详情页中,initData()

    遍历children的集合(因为封装的时候用的是集合去封装),创建页签对象,数量与集合一直,最后全部储存在页签集合中

    然后在ViewPager是配置器中设置这个集合的页签

    考虑到每个页签的标题不一样,通过可以通过构造把标题传递过去

    这里设置标题不能在initView()中设置,放到initData()中设置,不然代码顺序不一致,null

    额外:页签滑动事件处理

    这样设置的ViewPager与父容器的触摸事件冲突了,滑动很费力

    所以在父容器的ViewPager(那个自定义控件中)interceptTouchEvent() 的返回值置为flase

    2,开源框架ViewPagerIndicator的使用(ViewPager页面指示器)

    通过实例代码中的实例找到需要的效果,然后全局搜索找到相关的代码,然后借鉴(Copy);

    这里在eclipse中使用会出现v4包冲突,这里就不能直接删Library中的v4(因为它本身依赖的就是自身的)v4包版本搞一致就可以了(如果是实例和Library包中的v4包冲突,删掉实例的v4,改一致也可以,不过可能有问题).

    使用框架(具体流程参考示例代码):

    ①布局文件中,创建一个TabPageIndicator控件和一个ViewPager(前面已经创建了)

    ②代码中将指示器和ViewPager绑定一起(要在setAdapter()之后)

    ③在ViewPager适配器里重写getPagerTitle()方法

    ④发现效果不一样,是因为示例中设置了一个主题,同样copy过来就行了.

    背景变成黑色,因为主题的原因.所以设置一个背景颜色就可以了

    ⑤修改indicator指示器文本的颜色(带有一个状态选择器),指示器的蓝条

    因为是改了主题才有的蓝条,所以查看主题中的蓝条样式即可

    但是看到蓝条样式,并不能修改,因为它在库中

    所以干脆把样式copy出来放到项目里,再修改,改成需要的样式.

    同样的文字也有样式,可以修改选择器.

    3.指示器事件处理

    3.1 当在指示器上滑动的时候,滑出了侧边栏,因为指示器和侧边栏冲突了.

    解决方式:让需要事件的子控件强制拦截掉所有事件,不让别的控件抢到.

    在指示器类中(实际上是在类库中的源码中)

    重写dispatchTouchEvent()方法

    请求所有父控件不要拦截事件,包括爷爷(叔叔什么的都拦截不了)都不要拦截

    getParent().requestDisallowIntercepteTouchEvent(true);

    3.2 页签滑动的时候也会滑出侧边栏

    这里不适合直接请求所有父控件不要拦截,在第一个页签的时候才让侧边栏可以滑出.

    解决方式:实现 ViewPager的滑动事件,拿到SlidingMenu对象.

    但是这里不能使用ViewPager的滑动事件监听器,而要用指示器的监听器

    mIndicator.setonPagerChangeListener(this)

    在重写的方法里,页面被选中时,判断是否需要开启禁用SlidingMenu.

    3.3 去掉ListView分割线(默认是有一条分割线的)

    属性android:divider=”@null”可以去掉条目间的分割线

    4 页签点击按钮跳转下一页

     

    在新闻标签页中,给指示器添加一个图标

    这里的按钮事件就用Xtuils的功能

    创建一个方法(view),在上面加注解@onClick(id)即可

    先拿到当前的选中条目,再进行++,设置给ViewPager(它自己处理了索引越界问题)

    5,页签详情页结构分析

     

    5.1 给页签详情页设置布局ViewPager + ListView

    找到关心的控件

    设置ViewPager适配器

    返回的条目数跟网络数据有关,Children中的url

    5.2 在页签详情页中访问网络,从传递过来的网络数据中读取到url,访问它,(这里的前缀要自己写,不过前面已经封装好了)

    这里的url返回的也是一个json,创建一个JAVABean封装数据

    然后用GSON进行解析

    记得打印一下结果,看看跟预期想要的数据是否一致

    5.3 从返回的结果中获取到页签详情页的ViewPager的数据(TopNews头条新闻)

    设置条目数,设置默认的图片

    然后下载图片,下载完了流把图片设置给条目(需要避免内存溢出,oom,加缓存提高速度)

    Xutils模块>>BitmapUtils

    ①使用方式

    BitMapUtils mBitMapUtils = new BitMapUtils(mActivity);

    mBitMapUtils.display(view(需要设置的控件),url(通过数据中的url路径获取))

    ②不过设置完会显示与容器范围不完整匹配,设置成背景会好一些

    但是mBitMapUtils是默认设置成src,修改它太麻烦了

    imageView.setScaleType(ScaleType.FIT_XY)//设置图片缩放方式,填充父容器

    ③读取缓存:在请求数据之前就加载缓存

    加载缓存,访问网络得到JSON之后把缓存设置进来

    图片缓存有BitMapUtils进行了缓存处理

    5.4 轮播图滑动事件处理(dispatchTouchEvent()方法内处理)

    问题1:在页签里TopNews ViewPager和新闻详情页的ViewPager冲突了

    解决1:创建一个自定义控件ViewPager申请父类不要拦截

    问题2:分析项目可知,如果画到轮播图最后一个图片或第一个图片应该可以继续滑.同时上下滑动也不应该拦截

    分析2:上下滑动,父控件拦截

     向右滑动并且是第一个页面,父控件需要拦截

     向左滑动并且是最后一个页面,父控件需要拦截

    拿到item总数

    getAdapter().getCount();//通过适配器拿到总数

    注意:还是要保留前面的请求父类不要拦截,不然不会走后面的触摸拦截事件

    6,更新头条新闻标题

    6.1 不管是加载缓存还是访问网络,都有一段时间的空白,用户体验不好

    mBitMapUtils.configdefaultLodingImage(id)//设置加载中的默认图片

    6.2 轮播的描述文本,用一个帧布局来做,让描述文本压在图片上即可

    布局属性中半透明简写#a000

    更新描述文本,ViewPager的事件监听器中,默认选中第0

    文本通过解析网络数据中的内容得到

    6.3 小圆点根据开源框架中的效果,找到对应的代码和布局,copy过来

    CirclePagerIndicator自定义控件

    需要修改小圆点的样式:开源框架提供布局,代码方法,主题样式三种修改方式.

    这里用布局文件修改,找到布局方式对应的控件,对比颜色进行修改即可.

    需要注意的是:命名空间的声明,copy过来就可以

    问题1:当页签切换的时候,小圆点与显示的轮播不一致

    mIndicator.onPageSelected(0)//默认选中第一个,解决页面重新初始化的时候,Indicator与实际图片显示不一致.

    优点:使用方便

    缺点:细节修改太麻烦,比如这个指示器之间圆点的距离修改,很麻烦

    7.新闻列表的加载,CenterCrop属性裁剪,参看界面图

     

    7.1 创建ListView在布局中.

    获取完网络数据,通过网络数据中的列表数据(newsTabBean.data.news)

    创建适配器

    创建条目布局文件

    条目中,最好把宽高固定下来.

    但是发现图片并没有把ImagView填充起来

    所以设置scaleType=’centerCrop’//根据控件大小进行裁剪,推荐使用

    图片周围的黑色边框其实是背景为黑色,padding=1dp

    条目的文本,ellipsize=”end” 可以让未显示完的文本显示为...

    maxLine=”2”限制最大显示行数

    7.2 新闻列表展现

    把网络数据的信息填充到ListView

    设置图片的时候,创建适配器的构造方法,在这里用BitMapUtils设置默认图片

    然后在每一个条目设置图片时,也用它去加载图片

     

    问题1:拖动的时候ListView变成黑色了

    ListView是有一个缓冲的颜色,是黑色,为了提高性能有时候会显示为黑色

    解决:布局数据cacheColorHint=”#fff”

    问题2:ListView占据的位置太小,头条新闻占据位置太大

    解决:把头条新闻作为LIstView的头布局

    把头条新闻抽取出来做成一个布局,然后listView.addHeaderView(view)

    注意,这里单独抽取出来之后,ViewUtils需要重新注入这个头布局

    如果头布局高度问题:在头布局上套一层LinearLayout>>>高度包裹内容

  • 相关阅读:
    网络爬虫学习软件篇-Python(一)下载安装(超详细教程,傻瓜式说明)
    Vue.js+BootStrap+.Net Core开发后台管理系统 初次接触学习记录(11-7)
    形参 ref 到底是做什么用的?
    SweetAlert拒绝单一的弹出警告框
    轻松学习C语言编程之函数知识详解
    C语言的这个小知识点,竟然连开发多年的老司机都了解的不完全
    「C语言」编程学习—控制语句goto语句解析!
    数学思维+C语言画小猪佩奇,来试试?
    抖音很火的告白编程程序,C语言一样也能做
    世界最强的编程语言:C语言
  • 原文地址:https://www.cnblogs.com/adventurer/p/5668126.html
Copyright © 2020-2023  润新知