[项目总结]应用市场app
来源:互联网 发布:路由器密码查询软件 编辑:程序博客网 时间:2024/05/08 15:22
项目简介
这是一款下载应用和游戏的软件。具备用户登录,应用包管理,检查更新,设置,查看应用和游戏详情等主要功能。
项目实现过程
- 封装BaseActivity,记录当前打开的Activity,配合一键退出应用(两种方法:1:调用finish所有activity的方法,2:发送广播finish所有activity)
- ActionBar+DrawerLayout
- ActionBar添加搜索按键,返回按钮的处理
- 主界面actionBar 上添加控制抽屉的开关
- DrawerLayout使用ActionBarDrawerToggle和actionBar关联
- ViewPager+PagerTabStrip
- ViewPager实用自带的PagerTabStrip实现、首页、应用、游戏、专题、分类、排行页面
- ViewPager+Fragment
- 封装BaseFragment,SwipeRefreshLayout下拉刷新,制定子类要实现的方法
- FragmentFactory,把Fragment存放到集合,复用
- 封装LoadingPager,app的显示框架
- 四种界面: 加载中, 加载错误,加载为空 ,加载成功
- 根据不同的状态去切换界面
- ViewPager默认加载3页的关系,复用LoadingPager
- 封装BaseProtocol,访问服务器加载页面的数据,把数据缓存到本地,复用本地缓存框架
- 加载成功界面的显示
- listView的使用
- 应用界面listView头部添加一个轮播图View
- SwipeRefreshLayout下拉刷新,listView底部加载更多
- listView的优化
- 封装listView的adapter(DefaultAdapter),listView的adapter的框架
- adapter的优化,Viewholder的复用
- 快速滑动的时候不加载图片
- 封装BaseHolder,以BaseHolder为模块显示
- 应用和游戏详情界面的实现,继承BaseHolder以模块显示组成界面
- 使用值动画对应用是否安全和应用简介模块显示或收起
- 用户登录模块,继承BaseProtocol请求数据,继承BaseHolder以模块显示
- 排行页面
- 自定义View实现不规则textView的摆放
- 设置界面的实现
- 是否自动更新功能
- 同时下载任务数量功能
- 安装包管理界面的实现
- listView显示当前应用下载的安装包
- 点击listView条目跳转安装
- 长按listView条目,弹出批量删除选项
- 检查更新的实现
- popupWindow友好提示
- Dialog显示更新详情和版本
- 关于模块的实现Dialog显示详情和版本
- 下载应用和游戏模块的实现,主页面点击下载后显示自定义进度条
- 使用观察者设计模式实现,主界面和应用详情页的下载进度,暂停,等待下载,下载失败,下载完成的统一
- 线程池的使用,供整个app耗时操作使用,结合设置模块控制同时下载任务数量功能
项目的特点和使用到的开源library
- app框架的设计
- java面向对象的特点,类的封装
- listView不同的条目的复用
- 使用的设计模式
- 工厂设计模式
- 单例设计模式(主要是懒汉式)
- 观察者设计模式
- 开源library:xUtils
项目遇到的问题
- 由于ViewPager默认加载3页面,在复用LoadingPager时报了个illegalstateexception(The specified child already has a parent)异常,原因就是由于使用FragmentFactory缓存了Fragment,导致ViewPager回收页面时Fragment并没有销毁,当再次加载被回收的页面时,复用了Fragment,但此时Fragment里的LoadingPager已经存在父View,导致程序崩了。
- 解决方法就是移除 LoadingPager之前的父View
public static void removeParent(View v){ // 先找到父View 再通过父View去移除孩子 ViewParent parent = v.getParent(); //所有的控件 都有父View 父View一般情况下 就是ViewGoup if(parent instanceof ViewGroup){ ViewGroup group=(ViewGroup) parent; group.removeView(v); } }
- listView不同的条目的复用
- 由于一开始只是根据position和datas.size()+1判断复用条目,但这样只是复用一个条目,并没有真正复用不同的条目,并且可能会出现一些未知的bug
- 解决方法:根据Google官文档,复写两个方法,原理就是分配两个公共内存,根据不同标记复用:
//返回不同条目类型 @Override public int getItemViewType(int position) { ... return getInnerItemViewType(position); } //添加复用的listView条目 @Override public int getViewTypeCount() { return super.getViewTypeCount() + 1; }
- listView的复用导致主页面数据错乱
- 解决方法:主页面的下载进度,暂停等状态是根据被观察者回调刷新界面的,而每个listView的条目的数据都带有一个ID,根据被观察者回调传的数据判断是否和listView的条目的数据ID是否同一个刷新界面
项目部分图片:
项目地址:https://github.com/bullWing/ApplicationsPaly
0 0
- [项目总结]应用市场app
- 项目实战(app应用市场)----重写View
- 视频App市场总结
- 总结安卓应用市场App首发活动规则
- 应用市场项目小结
- 应用市场CMS总结
- 海外app应用市场分享!
- App跳转到应用市场
- App 到各大应用市场评分
- android应用中打开app应用市场
- 项目实战(应用市场)----FragmentFactory
- 社交类APP市场的四大总结:免费应用有点坑
- 如果APP应用市场是这样的
- app跳转到应用市场打分
- Android App跳转到应用市场
- Android App 评价/跳转到应用市场
- app发布到应用市场的有感
- Android APP上线必不可少的应用市场!
- CentOS简单操作(三)
- 最大堆及优先队列的实现
- 连接Linux服务器的终端仿真软件的termianl type详解
- 数据结构--链表
- Servlet中用Cookie实现自动登录
- [项目总结]应用市场app
- 洛谷 P2888 [USACO07NOV] 牛栏Cow Hurdles
- 建造者模式(Builder)
- 二叉堆
- Mybatis与Ehcache整合
- Android 动画使用的笔记整理
- Ural1876-Centipede's Morning
- 最长回文串
- JDBC 整个过程: