基于 Material Design 的 Gank IO 客户端(内含妹子图)

版权声明:本文为博主原创文章,未经博主允许不得转载。
微博:厉圣杰
源码:GankIO
文中如有纰漏,欢迎大家留言指出。

去年 RxJava + Retrofit 很火,但是自己一直没有接触,周末闲来无事,使用 MVP + RxJava + Retrofit + ButterKnife 写了一个简单的基于 GankIO 提供的 API 的 Material Design 的客户端。不过,不得不自己吐槽一下,每日精选自己设计的真的很丑,特别是显示日期的 Item。

先上个效果图:


gank.gif
gank.gif

项目架构

简单说下项目架构,项目分为 appcorelibrary 三个 module。其中,library 是第三方的下拉刷新库,可以先忽略。

w300

core 是与业务逻辑无关的库,包含一些基类,如:BaseActivityBaseFragment等,这里封装好了 ButterKnife ,不得不说,使用注解真的可以极大的加快开发效率。
manager 包下的 ActivityManager 用于管理应用的 Activity 栈,但此类与系统的类重名,有待商榷
BaseImage 是临时封装 ImageViewGlide 的,封装的很差,待改进。
utils 包下是一些常见的工具类。

app 是基于 GankIO 的客户端,涉及到具体的业务逻辑,其项目结构大致如下:
![屏幕快照 2017-03-21 下午10.37.28 w300](http://odsdowehg.bkt.clouddn.com/屏幕快照 2017-03-21 下午10.37.28.png)

其中,modules 包下是客户端的界面,由于界面不多,所以没有细分。

contract 是 MVP 模式的契约类,具体可以参考 Google 开源的 MVP 项目:android-architecture。就 MVP 模式来说,Google 的这种方式不得不说的确很不错,在契约类中包含了 Model 、View 、 Presenter 三层的契约,查看起整体逻辑会方便很多,在一定程度上也能减少使用 MVP 模式导致的类爆炸问题。

presenter 包下则是 P 层的实现,只涉及业务、数据,不涉及 UI ,UI 的操作全部封装在 V 层。

model 包下则是 Model 层的实现,该层只负责数据请求,如果数据不是很复杂,完全可以将其与 P 层合并。个人觉得,模式这种东西提供的是一种思路,要善于变通

如果对 MVP 模式不是很理解,可以切换到 master 分支,检出 tag 为 v1.0.0 的提交记录,该项目最初版本为非 MVP 模式实现。

项目中碰到的问题小记

SwipeRefreshLayout 与 WebView 的滑动冲突

v1.0.0 版本中,使用 WebView 加载页面时,存在将网页上滑到顶部时,会与 SwipeRefreshLayout 的下拉事件存在冲突,这里采用了一种侵入式的解决方法,代码如下:

mWebView.setOnScrollChangedListener(new ScrollWebView.OnScrollChangedListener() {
       @Override
       public void onScrollChanged(int l, int t) {
           Log.d(TAG, "l = " + l + ";t = " + t);
           if (mWebView.getScrollY() == 0) {
               mSwipeRefreshLayout.setEnabled(true);
           } else {
               mSwipeRefreshLayout.setEnabled(false);
           }
       }
   });

WebView 页面自适应

细心的朋友可能已经发现,图片加载跟网页加载一样,都是使用 WebView 实现,但是 WebView 加载图片时并不会自适应,所以这里需要对 WebView 进行设置。这里给出项目中对 WebView 进行的所以设置

private void initWebViewSettings() {
   WebSettings settings = mWebView.getSettings();
   // 开启 JS 支持
   settings.setJavaScriptEnabled(true);
   // 支持屏幕缩放
   settings.setSupportZoom(true);
   // 设置出现缩放工具
   settings.setBuiltInZoomControls(true);
   // 不显示webview缩放按钮
   settings.setDisplayZoomControls(false);
   // 扩大比例的缩放
   settings.setUseWideViewPort(true);
   //自适应屏幕
   settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
   settings.setLoadWithOverviewMode(true);
}

ViewPager + TabLayout + Fragment的状态保存

相信这个问题许多人使用 ViewPager 时都碰到过,那就是有多个 Pager 的时候,比方从第 1 个页面切换到第 5 个页面,然后再切回去,会发现 Pager 又会重新初始化一次。这就会造成一种不是很好的用户体验。其实处理这个问题很简单,在 onSaveInstanceState 保存你需要保存的数据,再次初始化时判断 savedInstanceState 是否为空即可,代码如下:

@Override
public void onSaveInstanceState(Bundle outState) {
   mPresenter.onSaveInstanceState(outState);
   //计算出当前RecyclerView垂直方向的偏移量
   outState.putInt("offset", mRecyclerView.computeVerticalScrollOffset());
   super.onSaveInstanceState(outState);
}

@Override
protected void initData(Bundle savedInstanceState) {
   mPresenter = new CategoryPresenter(this);
   if (savedInstanceState != null) {
       //恢复之前的RecyclerView的偏移量
       //调用RecyclerView.offsetChildrenVertical可滚动指定偏移量
       mOffset = savedInstanceState.getInt("offset");
   }
}

欢迎 Star 和 Fork:GankIO

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351

推荐阅读更多精彩内容