Coder Social home page Coder Social logo

toutiao's Introduction

Platform Build Status Release GitHub license

头条

logo

头条是一款遵循材料设计(Material Design)的第三方今日头条客户端, 聚合了新闻/段子/图片/视频/头条号内容, 没有广告, 仅仅只有存粹的阅读, 不断完善中, 采用 MVP + RxJava + Retrofit 架构的项目

其中API来自 今日头条Api分析

Statement

以下所有 API 均由 今日头条 提供, 本人采取非正常手段获取. 本程序仅供学习交流, 不可用于任何商业用途

Features

  • 首页五大模块: 新闻 / 图片 / 视频 / 头条号 / 问答
  • 实现首页的布局和数据的显示
  • 实现自定义新闻栏目顺序
  • 新闻详情页面支持日夜两种主题
  • 显示新闻评论
  • 头条号订阅 查看头条号历史文章 / 视频
  • 搜索功能 热门搜索推荐 搜索历史记录
  • 自定义主题颜色 无缝切换日夜皮肤
  • 视频播放
  • 内置3款 logo 随意互换
  • 动态切换字体大小

Screenshots

Preview

Download

由于侵犯 今日头条 版权, 故不再提供 APK 下载

Points

  • 基本遵循 Material Design 设计风格
  • 抓包获取今日头条API
  • 使用 Google 官方 MVP 架构
  • DrawerLayout + NavigationView + BottomNavigationView 搭配使用
  • RxBus 代替 EventBus 进行组件之间通讯
  • ViewPager 搭配 Fragment 懒加载
  • SwipeRefreshLayout 搭配 RecyclerView 下拉刷新上拉加载
  • 自定义 BottomNavigationBehavior 实现上滑隐藏下滑显示
  • RxJava + Retrofit2 + OkHttp3 做网络请求
  • OkHttp3 对网络返回内容做缓存, 还有日志、超时重连、头部消息的配置
  • V层基类的构建, 包括 BaseActivity 和 BaseFragment , 对外提供了相同的接口
  • 使用原生的夜间模式
  • 解决侧滑返回与 View 冲突问题
  • 内置 3 款 Logo, 随意切换
  • 使用 CoordinatorLayout 、 AppBarLayout 、 CollapsingToolbarLayout 、 BottomSheetDialog 等等新控件
  • 使用 7.0 新工具 DiffUtil , 不再无脑 notifyDataSetChanged
  • 使用 ItemTouchHelper 实现今日头条的频道排序、频道移动, 参考 ItemTouchHelperDemo
  • 使用 RxBinding 优雅实现搜索请求
  • 使用 AutoDispose 绑定 RxJava 生命周期
  • 使用 Travis Cl 持续集成

Changelog

2018-3-10
部分 WebView 页面支持点击查看图片
图片浏览器上下滑动退出

2018-2-26
使用 AutoDispose 解决了 RxLifecycle 侵入性强的问题

2017-11-11
优化启动页面

2017-9-5
添加使用说明, 首次启动会引导用户使用

2017-8-27
解决新闻栏目位置调换后 recreate 

2017-8-17
添加字体大小设置选项

2017-7-25
添加双击底栏按钮监听事件

2017-7-24
添加自动切换夜间模式选项

2017-7-22
修复 S8 播放视频bug
更新API

2017-7-20
添加滑动返回
更新新闻阅读 UI
修复 bug

2017-7-18
添加自定义图标选项

2017-7-14
解决使用BottomSheetDialog时状态栏变黑的问题

2017-7-12
优化"加载完毕"的提示
视频界面支持透明状态栏

2017-7-6
支持查看头条号主页
优化头条号订阅
更新视频 API

2017-7-2
自定义颜色的BUG修正

2017-6-29
修复新闻加载

2017-6-25
添加热门搜索

2017-6-22
添加搜索建议

2017-6-17
添加搜索历史记录

2017-6-16
重写搜索模块(beta)
重构代码

2017-6-4
添加导航栏着色设置选项
添加视频横屏设置选项
调整 UI 颜色

2017-5-31
封装 ImageLoader
ViewPager 动态更新

2017-5-30
修复新闻重复 bug

2017-5-25
更换 API
添加 N 多新闻栏目
添加头条问答模块

2017-5-19
新闻 "推荐" 栏目支持浏览 新闻 / 视频(beta)

2017-5-18
更新获取评论 API
所有 UI 控件配色跟随主题颜色
优化无图模式 (开启后在非Wifi下不加载图片)

2017-5-15
修复颜色错乱 bug
屏蔽视频播放器无用的按钮
更新列表 item 布局
视频播放界面全屏沉浸式

2017-5-12
修复闪退 bug 
增加自定义主题颜色

2017-5-11
修复无法下拉刷新 bug
重构项目

2017-5-9
更新部分 UI
图片浏览器若获取数据失败 则采用 WebView 加载

2017-4-18
修复新闻重复 bug (DiffUtil解决) 

2017-4-15
添加头条号订阅
优化清除缓存

2017-4-4
添加视频模块

2017-3-26
修复 Fragment 出栈 bug
增加 about 界面

2017-3-23
完善设置界面

2017-3-16
修复屏幕旋转重新加载
优化 RecyclerView 显示加载更多

2017-3-13
添加拖拽标签

2017-3-6
修复6.0运行时权限

2017-3-2
添加预加载

2017-2-26
优化无图/夜间模式

2017-2-25
部分界面支持点击 Toolbar 返回顶部
优化 BottomSheet 界面
优化无图模式(beta)

2017-2-23
添加夜间模式切换(beta)

2017-2-22
WebView无图模式(beta)

2017-2-21
修复bug

2017-2-20
添加设置界面
添加无图模式(beta)

2017-2-19
添加图片保存
优化评论列表界面(使用 BottomSheetDialog 代替 MaterialDialog)
添加6.0运行时权限

2017-2-18
完善图片浏览(ViewPager + PhotoView)

2017-2-16
添加图片专栏

2017-2-8
第一版正式发布

2017-2-7
添加搜索功能

TODO

  • WebView无图模式支持点击加载图片
  • 本地缓存(待定)
  • 视频支持切换分辨率
  • 本地新闻
  • 视频离线缓存
  • 浏览历史
  • 收藏夹

Libraries

End

注意:此开源项目仅做学习交流使用, 不可用于任何商业用途. 如果你觉得不错, 对你有帮助, 欢迎点个 fork, star, follow , 也可以帮忙分享给你更多的朋友, 这是给作者最大的动力与支持

License

Copyright 2017 iMeiji

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

toutiao's People

Contributors

imeiji avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

toutiao's Issues

主题色切换

请问下一条中的主题色是怎么切换的?
public void onColorSelection(@nonnull ColorChooserDialog dialog, @ColorInt int selectedColor)
方法中只有切换状态栏、任务栏、导航栏的颜色
请问是怎么动态切换主题色的?

MainActivity中屏幕恢复时取出位置这个不太准确。

测试机型:小米 MI5 7.0
1、屏幕旋转时并没有执行onSaveInstanceState,也没有执行:if (savedInstanceState != null) 里的代码。
2、按home键:执行了onSaveInstanceState,回到前台并没有执行if (savedInstanceState != null) 里的代码。
3、recreate();执行后,先执行了onSaveInstanceState,后执行了if (savedInstanceState != null) 里的代码。
总结:
1、这部分现场保护机制在recreate(); 起作用了。
2、屏幕旋转:并没有起到作用。
3、当然官网说的那种...becomes vulnerable to being destroyed by the system...没有测到。
这个注释“屏幕旋转时记录位置”感觉很迷惑。或者是和我的测试机有关?

NewsChannelAdapter里的动画错位

activity_news_channel里RecyclerView应该由FrameLayout包含:

<include layout="@layout/toolbar" />

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clipChildren="false"
        android:clipToPadding="false"
        android:padding="8dp" />
</FrameLayout>

配置文件合并失败究竟是.....

楼主你好,编译完成的时候出现这个错误
Error:Execution failed for task ':app:processDebugManifest'.

Manifest merger failed with multiple errors, see logs

点进去显示的具体错误信息如下:Merging Errors: Error: tools:replace specified at line:26 for attribute android:value, but no new value specified app main manifest (this file), line 25 Error: Validation failed, exiting app main manifest (this file)

有什么好的解决办法嘛

感谢作者开源供大家学习,关于底栏导航想请教下

感谢作者,通过这个开源项目我学了不少东西,想请问下BottomNavigationView默认是不是只完整显示3个菜单啊?你这个默认显示4个设置是怎么实现的呢?我看了下代码没怎么看明白,大佬能不能写个文章介绍下啊

感谢楼主的分享,请问下楼主这个类LazyLoadFragment的作用

public abstract class LazyLoadFragment extends BaseFragment {

protected boolean isViewInitiated;
protected boolean isVisibleToUser;
protected boolean isDataInitiated;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    isViewInitiated = true;
    prepareFetchData();
}

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    this.isVisibleToUser = isVisibleToUser;
    prepareFetchData();
}

public abstract void fetchData();

public boolean prepareFetchData() {
    return prepareFetchData(false);
}

public boolean prepareFetchData(boolean forceUpdate) {
    if (isVisibleToUser && isViewInitiated && (!isDataInitiated || forceUpdate)) {
        fetchData();
        isDataInitiated = true;
        return true;
    }
    return false;
}

}

是为了保证只加载一次Fragment? 然后一个Fragment只调用一次fetchData()方法进行注册?

华为荣耀8闪退

荣耀8有时候闪退 尤其是在搜索的时候 而且在我网络正常的情况下会出现网络错误的情况

gradle3.3无法编译

你好,我看到你的项目中是用到gradle4.4 Android studio3.0 但放到我的studio中编译是报错的。这个应该是怎么解决的呢
image

App不再更新

由于收到今日头条侵权警告邮件, 本 App 已在 Google Play 和 酷安 市场下架, 同时禁止其他市场上架此 App, 代码还会继续完善下, 但不再提供 APK

oppor7安装启动崩溃,系统4.4

11-14 15:44:16.700 18707-18707/com.meiji.toutiao E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.meiji.toutiao, PID: 18707
java.lang.NoClassDefFoundError: com.meiji.toutiao.util.SettingUtil$SettingsUtilInstance
at com.meiji.toutiao.util.SettingUtil.getInstance(SettingUtil.java:19)
at com.meiji.toutiao.InitApp.initTheme(InitApp.java:32)
at com.meiji.toutiao.InitApp.onCreate(InitApp.java:24)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1007)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4443)
at android.app.ActivityThread.access$1500(ActivityThread.java:143)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1269)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5120)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:818)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:634)
at dalvik.system.NativeStart.main(Native Method)

头条数据获取失败

头条的新闻标题数据貌似需要携带cookie才可以拿到,但是你的代码中貌似没有看到有携带cookie?

我想知道在activity_main的BottomNavigationView控件中,layout_behavior这个 属性是用来干嘛的

<android.support.design.widget.BottomNavigationView android:id="@+id/bottom_navigation" style="@style/Widget.Design.BottomNavigationView" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_gravity="bottom" android:background="@color/viewBackground" app:elevation="16dp" app:itemIconTint="@drawable/nav_item_color_state" app:itemTextColor="@drawable/nav_item_color_state" app:layout_behavior="com.meiji.toutiao.widget.behavior.BottomNavigationBehavior" app:menu="@menu/bottom_navigation_main"/>
在behavior文件夹中有两个类并没有用到,不知道他们的用途是什么,谢谢查看,

在Android版本4.4的模拟器上启动报错

Process: com.meiji.toutiao, PID: 3910 java.lang.NoClassDefFoundError: com.meiji.toutiao.util.SettingUtil$SettingsUtilInstance at com.meiji.toutiao.util.SettingUtil.getInstance(SettingUtil.java:19) at com.meiji.toutiao.InitApp.initTheme(InitApp.java:32) at com.meiji.toutiao.InitApp.onCreate(InitApp.java:24) at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1024) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4346) at android.app.ActivityThread.access$1500(ActivityThread.java:135) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5019) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) at dalvik.system.NativeStart.main(Native Method)

怎么我的as跑起来报错了

楼主好,小弟安卓新手,在运行你项目的时候,所有控件初始化的时候,都报强转类型出错,
比如 :Toutiao-master\app\src\main\java\com\meiji\toutiao\adapter\photo\PhotoContentAdapter.java
Error:(57, 57) 错误: 不兼容的类型: View无法转换为ImageView
类似这样的,好奇怪,是我as版本低了吗?

打开应用就闪退,日志如下(魅族魅蓝3S-Flyme6)

05-12 18:24:13.371 7262 7262 E AndroidRuntime: FATAL EXCEPTION: main
05-12 18:24:13.371 7262 7262 E AndroidRuntime: Process: com.meiji.toutiao, PID: 7262
05-12 18:24:13.371 7262 7262 E AndroidRuntime: java.lang.NoSuchMethodError: No virtual method getColor(ILandroid/content/res/Resources$Theme;)I in class Landroid/content/res/Resources; or its super classes (declaration of 'android.content.res.Resources' appears in /system/framework/framework.jar)
05-12 18:24:13.371 7262 7262 E AndroidRuntime: at com.meiji.toutiao.module.base.BaseActivity.onResume(Unknown Source)
05-12 18:24:13.371 7262 7262 E AndroidRuntime: at com.meiji.toutiao.MainActivity.onResume(Unknown Source)
05-12 18:24:13.371 7262 7262 E AndroidRuntime: at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1286)
05-12 18:24:13.371 7262 7262 E AndroidRuntime: at android.app.Activity.performResume(Activity.java:6286)
05-12 18:24:13.371 7262 7262 E AndroidRuntime: at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3418)
05-12 18:24:13.371 7262 7262 E AndroidRuntime: at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3471)
05-12 18:24:13.371 7262 7262 E AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2780)
05-12 18:24:13.371 7262 7262 E AndroidRuntime: at android.app.ActivityThread.access$900(ActivityThread.java:189)
05-12 18:24:13.371 7262 7262 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1599)
05-12 18:24:13.371 7262 7262 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:111)
05-12 18:24:13.371 7262 7262 E AndroidRuntime: at android.os.Looper.loop(Looper.java:194)
05-12 18:24:13.371 7262 7262 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5883)
05-12 18:24:13.371 7262 7262 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
05-12 18:24:13.371 7262 7262 E AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:372)
05-12 18:24:13.371 7262 7262 E AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1119)
05-12 18:24:13.371 7262 7262 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:885)
05-12 18:24:13.371 7262 7262 E AndroidRuntime: at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:102)

有关于5.0系统以下出现java.lang.NoClassDefFoundError

5.0以下或部分机型,会出现NoClassDefFoundError异常crash,原因是方法数已经超出了65535,导致部分方法导入了第二个dex文件中。
解决方法:
1.在build中增加 implementation 'com.android.support:multidex:1.0.1'
2.InitApp类继承MultiDexApplication类
适配5.0以下机型。

AS编译问题

您好,clone下了您的代码后,用AS打开,报下面的问题
default

关于LazyLoadFragment的一些疑问

作者在onActivityCreated和setUserVisibleHint中都调用了prepareFetchData方法,
pq8wd 1rw6n u8opok6c 5a
但是我尝试打印了一下onActivityCreated和setUserVisibleHint两个方法的调用顺序,结果如图
image
也就是说setUserVisibleHint在调用prepareFetchData直接返回了false,请问这里重复调用的用意是什么呢,有什么特殊想法

缓存那里

请问一下,缓存那里的设置,如果有的地方不需要缓存了怎么设置啊?我看这个缓存设置是全局的吧?比如评论我这里不想要缓存,那如何设置呢?

bug

@iMeiji 本人仿照你的代码写,遇到一个bug,已经要怀疑人生了,您如果不忙的话,可以帮我看看怎么回事吗?qq:807142217,谢谢

关于网络状态处理提个小建议

首先这个APP很有参考价值谢谢作者.
提个建议:
刷新和获取更多网络超时希望能够统一处理.目前app在网络条件不好的情况下回不停的loading并且不会消失,有个超时处理会更好.

关于onRefresh方法重写的问题

``public interface INewsArticle {

interface View extends IBaseListView<Presenter> {

    /**
     * 请求数据
     */
    void onLoadData();

    /**
     * 刷新
     */
    void onRefresh();
}``

在这个接口中有一个onRefresh方法,但是在这个接口的实现类NewsArticleView中,并没有实现onRefresh方法。但是也没有编译报错。
之后我发现是在BaseListFragment类中,有一个SwipeRefreshLayout.OnRefreshListener监听的onRefresh方法写在里面。
这里有点疑惑?两个方法名虽然一样,但是是两个不同接口里面的方法。为什么不会编译报错?
然后我把SwipeRefreshLayout.OnRefreshListener写成匿名内部类的方式,NewsArticleView类就因为没有实现INewsArticle.View中的onRefresh方法而报错。
大神,求解答,谢谢

视频列表可以优化吗

楼主你好,视频列表现在是展示图片,可以优化成在列表页面也可以点击播放吗?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.