From 0598eef49243e4c55d0d5c34a6611d3cf2de7ffb Mon Sep 17 00:00:00 2001 From: lambert Date: Fri, 6 Sep 2019 14:14:09 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E7=9F=A5=E4=B9=8E=E6=97=A5?= =?UTF-8?q?=E6=8A=A5=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- .../base/assist/ConfigConstants.java | 1 + .../com/heyongrui/base/utils/FileUtil.java | 136 +++++---------- .../com/heyongrui/base/utils/TimeUtil.java | 18 ++ .../com/heyongrui/base/widget/ReSpinner.java | 6 +- base/src/main/res/values/strings.xml | 1 + config.gradle | 3 +- module/build.gradle | 2 + module/src/main/AndroidManifest.xml | 3 + module/src/main/debug/AndroidManifest.xml | 3 + .../com/heyongrui/module/ModuleFragment.java | 4 + .../module/adapter/ModuleSectionAdapter.java | 31 +++- .../module/adapter/ModuleSectionEntity.java | 13 ++ .../module/dagger/ModuleComponent.java | 3 + .../module/data/api/DailyLifeApi.java | 25 +++ .../module/data/dto/ZhiHuDailyNewsDto.kt | 78 +++++++++ .../module/data/service/DailyLifeService.java | 32 ++++ .../zhihu/contract/ZhiHuDailyNewsContract.kt | 37 ++++ .../presenter/ZhiHuDailyNewsPresenter.kt | 165 ++++++++++++++++++ .../zhihu/view/ZhiHuDailyNewsActivity.kt | 148 ++++++++++++++++ .../src/main/res/drawable-xhdpi/ic_zhihu.png | Bin 0 -> 2210 bytes .../src/main/res/layout/activity_douban.xml | 4 +- .../res/layout/activity_zhihu_daily_news.xml | 79 +++++++++ .../res/layout/recycle_item_zhihu_news.xml | 37 ++++ module/src/main/res/values/strings.xml | 1 + .../main/res/layout/activity_leisure_read.xml | 2 +- 26 files changed, 733 insertions(+), 101 deletions(-) create mode 100644 module/src/main/java/com/heyongrui/module/data/dto/ZhiHuDailyNewsDto.kt create mode 100644 module/src/main/java/com/heyongrui/module/zhihu/contract/ZhiHuDailyNewsContract.kt create mode 100644 module/src/main/java/com/heyongrui/module/zhihu/presenter/ZhiHuDailyNewsPresenter.kt create mode 100644 module/src/main/java/com/heyongrui/module/zhihu/view/ZhiHuDailyNewsActivity.kt create mode 100644 module/src/main/res/drawable-xhdpi/ic_zhihu.png create mode 100644 module/src/main/res/layout/activity_zhihu_daily_news.xml create mode 100644 module/src/main/res/layout/recycle_item_zhihu_news.xml diff --git a/README.md b/README.md index 27d41d4..9030026 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ### 项目简介 “优聚”是一款集多个平台的资讯内容、复合型优秀资源和实用功能的APP,打破传统限制,融合多元,发现更多、更优秀、更有趣的东西。后续也会加入更多新的功能。也欢迎各位提出意见。 -项目是一款组件化综合案例,包含新闻,MONO资讯,开眼视频,美女图片,垃圾分类,一言,古诗词,智能聊天机器人,语音识别功能,干货集中营,豆瓣电影等等模块。 +项目是一款组件化综合案例,包含新闻,MONO资讯,开眼视频,知乎日报,美女图片,垃圾分类,一言,古诗词,智能聊天机器人,语音识别功能,干货集中营,豆瓣电影等等模块。 项目利用业余时间开发,时间不固定,暂时只实现了这些功能。 ### 主要模块 diff --git a/base/src/main/java/com/heyongrui/base/assist/ConfigConstants.java b/base/src/main/java/com/heyongrui/base/assist/ConfigConstants.java index 7772ddc..2ec4cc6 100644 --- a/base/src/main/java/com/heyongrui/base/assist/ConfigConstants.java +++ b/base/src/main/java/com/heyongrui/base/assist/ConfigConstants.java @@ -39,6 +39,7 @@ public class ConfigConstants { public static final String PATH_KAIYAN_LIST = "/module/kaiyanList"; public static final String PATH_KAIYAN_DETAIL = "/module/kaiyanDetail"; public static final String PATH_DOUBAN = "/module/douban"; + public static final String PATH_ZHIHU_DAILY_NEWS = "/module/zhiHuDailyNews"; public static final String PATH_GARBAGE_CLASSIFY = "/module/garbageClassify"; public static final String PATH_H5 = "/module/h5"; public static final String PATH_MODULE_PROVIDER = "/module/main/service"; diff --git a/base/src/main/java/com/heyongrui/base/utils/FileUtil.java b/base/src/main/java/com/heyongrui/base/utils/FileUtil.java index 59697fa..eb6a657 100644 --- a/base/src/main/java/com/heyongrui/base/utils/FileUtil.java +++ b/base/src/main/java/com/heyongrui/base/utils/FileUtil.java @@ -1,11 +1,19 @@ package com.heyongrui.base.utils; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.net.Uri; +import android.os.Build; import android.os.Environment; import android.text.TextUtils; import android.util.Log; +import android.webkit.MimeTypeMap; + +import androidx.core.content.FileProvider; + +import com.blankj.utilcode.util.ToastUtils; +import com.heyongrui.base.R; import java.io.File; import java.io.FileInputStream; @@ -20,102 +28,48 @@ public class FileUtil { public FileUtil() { } - public static final String[][] MIME_MapTable = { - //{后缀名, MIME类型} - {".3gp", "video/3gpp"}, - {".apk", "application/vnd.android.package-archive"}, - {".asf", "video/x-ms-asf"}, - {".avi", "video/x-msvideo"}, - {".bin", "application/octet-stream"}, - {".bmp", "image/bmp"}, - {".c", "text/plain"}, - {".class", "application/octet-stream"}, - {".conf", "text/plain"}, - {".cpp", "text/plain"}, - {".doc", "application/msword"}, - {".exe", "application/octet-stream"}, - {".gif", "image/gif"}, - {".gtar", "application/x-gtar"}, - {".gz", "application/x-gzip"}, - {".h", "text/plain"}, - {".htm", "text/html"}, - {".html", "text/html"}, - {".jar", "application/java-archive"}, - {".java", "text/plain"}, - {".jpeg", "image/jpeg"}, - {".jpg", "image/jpeg"}, - {".js", "application/x-javascript"}, - {".log", "text/plain"}, - {".m3u", "audio/x-mpegurl"}, - {".m4a", "audio/mp4a-latm"}, - {".m4b", "audio/mp4a-latm"}, - {".m4p", "audio/mp4a-latm"}, - {".m4u", "video/vnd.mpegurl"}, - {".m4v", "video/x-m4v"}, - {".mov", "video/quicktime"}, - {".mp2", "audio/x-mpeg"}, - {".mp3", "audio/x-mpeg"}, - {".mp4", "video/mp4"}, - {".mpc", "application/vnd.mpohun.certificate"}, - {".mpe", "video/mpeg"}, - {".mpeg", "video/mpeg"}, - {".mpg", "video/mpeg"}, - {".mpg4", "video/mp4"}, - {".mpga", "audio/mpeg"}, - {".msg", "application/vnd.ms-outlook"}, - {".ogg", "audio/ogg"}, - {".pdf", "application/pdf"}, - {".png", "image/png"}, - {".pps", "application/vnd.ms-powerpoint"}, - {".ppt", "application/vnd.ms-powerpoint"}, - {".prop", "text/plain"}, - {".rar", "application/x-rar-compressed"}, - {".rc", "text/plain"}, - {".rmvb", "audio/x-pn-realaudio"}, - {".rtf", "application/rtf"}, - {".sh", "text/plain"}, - {".tar", "application/x-tar"}, - {".tgz", "application/x-compressed"}, - {".txt", "text/plain"}, - {".wav", "audio/x-wav"}, - {".wma", "audio/x-ms-wma"}, - {".wmv", "audio/x-ms-wmv"}, - {".wps", "application/vnd.ms-works"}, - //{".xml", "text/xml"}, - {".xml", "text/plain"}, - {".z", "application/x-compress"}, - {".zip", "application/zip"}, - {"", "*/*"} - }; public static void openFileBySystem(Context context, String filePath) { + if (null == context) return; if (TextUtils.isEmpty(filePath)) return; - Intent intent = new Intent(); - File file = new File(filePath); - if (!file.exists()) return; - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//设置标记 - intent.setAction(Intent.ACTION_VIEW);//动作,查看 - intent.setDataAndType(Uri.fromFile(file), getMIMEType(file));//设置类型 - context.startActivity(intent); - } + try { + Intent intent = new Intent(); + File file = new File(filePath); + if (!file.exists()) return; + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//设置标记 + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//添加这一句表示对目标应用临时授权该Uri所代表的文件 + intent.setAction(Intent.ACTION_VIEW);//动作,查看 + + //使用系统API,获取文件MimeType类型 + String mimeType = null; + String extension = MimeTypeMap.getFileExtensionFromUrl(filePath); + if (!TextUtils.isEmpty(extension)) { + //使用系统API,获取MimeTypeMap的单例实例,然后调用其内部方法获取文件后缀名(扩展名)所对应的MIME类型 + mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension.toLowerCase()); + } - public static String getMIMEType(File file) { - String type = "*/*"; - String fName = file.getName(); - //获取后缀名前的分隔符"."在fName中的位置。 - int dotIndex = fName.lastIndexOf("."); - if (dotIndex < 0) - return type; - /* 获取文件的后缀名 */ - String fileType = fName.substring(dotIndex, fName.length()).toLowerCase(); - if (fileType == null || "".equals(fileType)) - return type; - //在MIME和文件类型的匹配表中找到对应的MIME类型。 - for (int i = 0; i < MIME_MapTable.length; i++) { - if (fileType.equals(MIME_MapTable[i][0])) - type = MIME_MapTable[i][1]; + //适配不同版本Uri处理 + Uri uri = null; + if (Build.VERSION.SDK_INT >= 24) { + uri = FileProvider.getUriForFile(context, context.getPackageName() + ".fileprovider", file); + } else { + uri = Uri.fromFile(file); + } + if (null != uri) { + intent.setDataAndType(uri, mimeType);//设置类型 + } + + //判断手机是否有打开文件的相关应用 + ComponentName componentName = intent.resolveActivity(context.getPackageManager()); + if (componentName != null) { + context.startActivity(intent); + } else { + ToastUtils.showShort(context.getString(R.string.no_app_support_tip)); + } + } catch (Exception e) { + e.printStackTrace(); + ToastUtils.showShort(context.getString(R.string.no_app_support_tip)); } - return type; } public static boolean fileIsExists(String path) { diff --git a/base/src/main/java/com/heyongrui/base/utils/TimeUtil.java b/base/src/main/java/com/heyongrui/base/utils/TimeUtil.java index aa20d4c..3d41851 100644 --- a/base/src/main/java/com/heyongrui/base/utils/TimeUtil.java +++ b/base/src/main/java/com/heyongrui/base/utils/TimeUtil.java @@ -196,4 +196,22 @@ public static String getCNDate(Date date) { cnDate.append("日"); return cnDate.toString(); } + + /** + * 判断是否是同一天 + */ + public static boolean isSameDay(Date date1, Date date2) { + if (null == date1 || null == date2) return false; + + Calendar calDateA = Calendar.getInstance(); + calDateA.setTime(date1); + + Calendar calDateB = Calendar.getInstance(); + calDateB.setTime(date2); + + return calDateA.get(Calendar.YEAR) == calDateB.get(Calendar.YEAR) + && calDateA.get(Calendar.MONTH) == calDateB.get(Calendar.MONTH) + && calDateA.get(Calendar.DAY_OF_MONTH) == calDateB + .get(Calendar.DAY_OF_MONTH); + } } diff --git a/base/src/main/java/com/heyongrui/base/widget/ReSpinner.java b/base/src/main/java/com/heyongrui/base/widget/ReSpinner.java index c91ceb2..32338d1 100644 --- a/base/src/main/java/com/heyongrui/base/widget/ReSpinner.java +++ b/base/src/main/java/com/heyongrui/base/widget/ReSpinner.java @@ -90,11 +90,13 @@ public void onItemSelected(AdapterView adapterView, View view, int i, long l) onReItemSelected(adapterView, view, i, l); } else {//初始默认不选中 if (isFirst) { - view.setVisibility(View.INVISIBLE); + if (null != view) { + view.setVisibility(View.INVISIBLE); + } isFirst = false; onReItemSelected(adapterView, view, -1, -1); } else { - if (view.getVisibility() != View.VISIBLE) { + if (null != view && view.getVisibility() != View.VISIBLE) { view.setVisibility(View.VISIBLE); } onReItemSelected(adapterView, view, i, l); diff --git a/base/src/main/res/values/strings.xml b/base/src/main/res/values/strings.xml index c040270..7f9d2ef 100644 --- a/base/src/main/res/values/strings.xml +++ b/base/src/main/res/values/strings.xml @@ -30,5 +30,6 @@ 清理成功 完成 没有搜索到相关内容 + 手机暂无应用支持打开此文件 添加 diff --git a/config.gradle b/config.gradle index 3b2c228..401712b 100644 --- a/config.gradle +++ b/config.gradle @@ -3,7 +3,7 @@ ext { isRunAloneUser = false;//user模块是否可以单独运行 isRunAloneModule = false;//module模块是否可以单独运行 isRunAloneModule2 = false;//module2模块是否可以单独运行 - isRunAloneIflytek = false;//科大讯飞模块是否可以单独运行 + isRunAloneIflytek = true;//科大讯飞模块是否可以单独运行 //版本号控制 versions = [ //Project @@ -43,5 +43,6 @@ ext { tagcloudlib : '1.2.0', jiaozivideoplayer : '7.0.4', ahbottomnavigation: '2.3.4', + banner : '2.3.16', ] } \ No newline at end of file diff --git a/module/build.gradle b/module/build.gradle index 45b5f74..59abc00 100644 --- a/module/build.gradle +++ b/module/build.gradle @@ -98,6 +98,8 @@ dependencies { kapt "com.google.dagger:dagger-compiler:${versions.dagger}" //视频框架 implementation "cn.jzvd:jiaozivideoplayer:${versions.jiaozivideoplayer}" + //banner + implementation "com.ms:Banner-androidx:${versions.banner}" testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test:runner:1.2.0' diff --git a/module/src/main/AndroidManifest.xml b/module/src/main/AndroidManifest.xml index 7f30aba..9a97aaa 100644 --- a/module/src/main/AndroidManifest.xml +++ b/module/src/main/AndroidManifest.xml @@ -46,5 +46,8 @@ + diff --git a/module/src/main/debug/AndroidManifest.xml b/module/src/main/debug/AndroidManifest.xml index 646853a..d168e02 100644 --- a/module/src/main/debug/AndroidManifest.xml +++ b/module/src/main/debug/AndroidManifest.xml @@ -62,6 +62,9 @@ + diff --git a/module/src/main/java/com/heyongrui/module/ModuleFragment.java b/module/src/main/java/com/heyongrui/module/ModuleFragment.java index 88067f5..95122e8 100644 --- a/module/src/main/java/com/heyongrui/module/ModuleFragment.java +++ b/module/src/main/java/com/heyongrui/module/ModuleFragment.java @@ -94,6 +94,9 @@ private void initRecyclerView(RecyclerView recyclerView) { case 8://电影 ARouter.getInstance().build(ConfigConstants.PATH_DOUBAN).navigation(); break; + case 9://知乎日报 + ARouter.getInstance().build(ConfigConstants.PATH_ZHIHU_DAILY_NEWS).navigation(); + break; } }); dataList.add(new ModuleSectionEntity(ModuleSectionEntity.MENU_CARD, new MenuCardDto(getString(R.string.tea), R.drawable.ic_tea, 1))); @@ -104,6 +107,7 @@ private void initRecyclerView(RecyclerView recyclerView) { dataList.add(new ModuleSectionEntity(ModuleSectionEntity.MENU_CARD, new MenuCardDto(getString(R.string.kaiyan), R.drawable.ic_kaiyan, 6))); dataList.add(new ModuleSectionEntity(ModuleSectionEntity.MENU_CARD, new MenuCardDto(getString(R.string.garbage_classification2), R.drawable.ic_ashcan, 7))); dataList.add(new ModuleSectionEntity(ModuleSectionEntity.MENU_CARD, new MenuCardDto(getString(R.string.movie), R.drawable.ic_movie, 8))); + dataList.add(new ModuleSectionEntity(ModuleSectionEntity.MENU_CARD, new MenuCardDto(getString(R.string.zhihu_daily), R.drawable.ic_zhihu, 9))); monoAdapter.replaceData(dataList); } } diff --git a/module/src/main/java/com/heyongrui/module/adapter/ModuleSectionAdapter.java b/module/src/main/java/com/heyongrui/module/adapter/ModuleSectionAdapter.java index 3716d50..981461b 100644 --- a/module/src/main/java/com/heyongrui/module/adapter/ModuleSectionAdapter.java +++ b/module/src/main/java/com/heyongrui/module/adapter/ModuleSectionAdapter.java @@ -53,6 +53,7 @@ import com.heyongrui.module.data.dto.PoemGroupDto; import com.heyongrui.module.data.dto.PoemSearchDto; import com.heyongrui.module.data.dto.TodayRecommendPoemDto; +import com.heyongrui.module.data.dto.ZhiHuDailyNewsDto; import com.heyongrui.module.mono.view.MonoTeaActivity; import java.util.Calendar; @@ -86,13 +87,19 @@ public ModuleSectionAdapter(int sectionHeadResId, List data addItemType(ModuleSectionEntity.POEM, R.layout.recycle_item_poem); addItemType(ModuleSectionEntity.POEM_GROUP, R.layout.recycle_item_poem_group); addItemType(ModuleSectionEntity.DOUBAN_MOVIE, R.layout.recycle_item_douban_movie); + addItemType(ModuleSectionEntity.ZHIHU_NEWS, R.layout.recycle_item_zhihu_news); } @Override protected void convertHead(BaseViewHolder helper, ModuleSectionEntity item) { -// TextView tvHeadSection = helper.getView(R.id.tv_head_section); -// tvHeadSection.setText(item.header); -// tvHeadSection.setVisibility(item.isShow() ? View.VISIBLE : View.GONE); + switch (item.getItemType()) { + case ModuleSectionEntity.ZHIHU_NEWS: + TextView tvHeadSection = helper.getView(android.R.id.text1); + if (null != tvHeadSection) { + tvHeadSection.setText(TextUtils.isEmpty(item.header) ? "" : item.header); + } + break; + } } @Override @@ -587,6 +594,24 @@ public void onItemClick(Context context, int position, RatioImageView ratioImage tvRate.setText(rate); } break; + case ModuleSectionEntity.ZHIHU_NEWS: { + UiUtil.setOnclickFeedBack(mContext, ContextCompat.getColor(mContext, R.color.background), ContextCompat.getColor(mContext, R.color.gray), helper.itemView); + TextView tvTitle = helper.getView(R.id.tv_title); + ImageView ivCover = helper.getView(R.id.iv_cover); + + String title = "", cover = ""; + ZhiHuDailyNewsDto.StoryBean storyBean = item.getStoryBean(); + if (null != storyBean) { + title = storyBean.getTitle(); + List images = storyBean.getImages(); + if (null != images && !images.isEmpty()) { + cover = images.get(0); + } + } + tvTitle.setText(TextUtils.isEmpty(title) ? "" : title); + GlideUtil.loadImage(mContext, cover, ivCover, ContextCompat.getDrawable(mContext, R.drawable.placeholder)); + } + break; } } } diff --git a/module/src/main/java/com/heyongrui/module/adapter/ModuleSectionEntity.java b/module/src/main/java/com/heyongrui/module/adapter/ModuleSectionEntity.java index 8be4a2f..9e0a0b8 100644 --- a/module/src/main/java/com/heyongrui/module/adapter/ModuleSectionEntity.java +++ b/module/src/main/java/com/heyongrui/module/adapter/ModuleSectionEntity.java @@ -13,6 +13,7 @@ import com.heyongrui.module.data.dto.PoemGroupDto; import com.heyongrui.module.data.dto.PoemSearchDto; import com.heyongrui.module.data.dto.TodayRecommendPoemDto; +import com.heyongrui.module.data.dto.ZhiHuDailyNewsDto; import java.util.List; @@ -34,6 +35,7 @@ public class ModuleSectionEntity extends SectionMultiEntity implements MultiItem public static final int POEM = 110; public static final int POEM_GROUP = 111; public static final int DOUBAN_MOVIE = 112; + public static final int ZHIHU_NEWS = 113; private int itemType; private int spanSize; @@ -50,6 +52,7 @@ public class ModuleSectionEntity extends SectionMultiEntity implements MultiItem private PoemGroupDto.DataBean groupPoemBean; private PoemGroupDetailDto.DataBean groupPoemDataBean; private DouBanDto.SubjectsBean subjectsBean; + private ZhiHuDailyNewsDto.StoryBean storyBean; public ModuleSectionEntity(boolean isHeader, String header, boolean isShow) { super(isHeader, header); @@ -92,6 +95,8 @@ public ModuleSectionEntity(int itemType, int spanSize, Object object) { this.groupPoemDataBean = (PoemGroupDetailDto.DataBean) object; } else if (object instanceof DouBanDto.SubjectsBean) { this.subjectsBean = (DouBanDto.SubjectsBean) object; + } else if (object instanceof ZhiHuDailyNewsDto.StoryBean) { + this.storyBean = (ZhiHuDailyNewsDto.StoryBean) object; } } } @@ -208,4 +213,12 @@ public DouBanDto.SubjectsBean getSubjectsBean() { public void setSubjectsBean(DouBanDto.SubjectsBean subjectsBean) { this.subjectsBean = subjectsBean; } + + public ZhiHuDailyNewsDto.StoryBean getStoryBean() { + return storyBean; + } + + public void setStoryBean(ZhiHuDailyNewsDto.StoryBean storyBean) { + this.storyBean = storyBean; + } } diff --git a/module/src/main/java/com/heyongrui/module/dagger/ModuleComponent.java b/module/src/main/java/com/heyongrui/module/dagger/ModuleComponent.java index a59c136..a2d9155 100644 --- a/module/src/main/java/com/heyongrui/module/dagger/ModuleComponent.java +++ b/module/src/main/java/com/heyongrui/module/dagger/ModuleComponent.java @@ -10,6 +10,7 @@ import com.heyongrui.module.douban.presenter.DouBanPresenter; import com.heyongrui.module.douban.view.DouBanActivity; import com.heyongrui.module.textword.view.SmartRobotActivity; +import com.heyongrui.module.zhihu.presenter.ZhiHuDailyNewsPresenter; import dagger.Component; @@ -33,4 +34,6 @@ public interface ModuleComponent { void inject(ModuleFragment moduleFragment); void inject(SmartRobotActivity smartRobotActivity); + + void inject(ZhiHuDailyNewsPresenter zhiHuDailyNewsPresenter); } diff --git a/module/src/main/java/com/heyongrui/module/data/api/DailyLifeApi.java b/module/src/main/java/com/heyongrui/module/data/api/DailyLifeApi.java index 0854a87..68f0d6b 100644 --- a/module/src/main/java/com/heyongrui/module/data/api/DailyLifeApi.java +++ b/module/src/main/java/com/heyongrui/module/data/api/DailyLifeApi.java @@ -1,7 +1,10 @@ package com.heyongrui.module.data.api; +import com.heyongrui.module.data.dto.ZhiHuDailyNewsDto; + import io.reactivex.Observable; import retrofit2.http.GET; +import retrofit2.http.Path; import retrofit2.http.Query; public interface DailyLifeApi { @@ -11,4 +14,26 @@ public interface DailyLifeApi { */ @GET("api/GetRefuseClassification.php") Observable getGarbageCategory(@Query("key") String garbage); + + /** + * 获取知乎日报最新消息(当天) + */ + @GET("news/latest") + Observable getZhiHuNewsLatest(); + + /** + * 获取知乎日报过往消息 + * + * @param date 格式:20131119,获取的是20131118的消息 + */ + @GET("news/before/{date}") + Observable getZhiHuPastNews(@Path("date") String date); + + /** + * 获取知乎日报具体消息内容HTML + * + * @param id StoryBean中的id + */ + @GET("news/{id}") + Observable getZhiHuNewsHtmlContent(@Path("id") int id); } diff --git a/module/src/main/java/com/heyongrui/module/data/dto/ZhiHuDailyNewsDto.kt b/module/src/main/java/com/heyongrui/module/data/dto/ZhiHuDailyNewsDto.kt new file mode 100644 index 0000000..0c7575a --- /dev/null +++ b/module/src/main/java/com/heyongrui/module/data/dto/ZhiHuDailyNewsDto.kt @@ -0,0 +1,78 @@ +package com.heyongrui.module.data.dto + +import android.os.Parcel +import android.os.Parcelable + +data class ZhiHuDailyNewsDto( + var date: String,//20190904 + var stories: List, + var top_stories: List +) : Parcelable { + data class StoryBean( + var ga_prefix: String, + var id: Int, + var images: List,//在stories中返回 + var image: String,//在top_stories中返回 + var title: String, + var type: Int + ) : Parcelable { + constructor(parcel: Parcel) : this( + parcel.readString(), + parcel.readInt(), + parcel.createStringArrayList(), + parcel.readString(), + parcel.readString(), + parcel.readInt()) { + } + + override fun writeToParcel(parcel: Parcel, flags: Int) { + parcel.writeString(ga_prefix) + parcel.writeInt(id) + parcel.writeStringList(images) + parcel.writeString(image) + parcel.writeString(title) + parcel.writeInt(type) + } + + override fun describeContents(): Int { + return 0 + } + + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): StoryBean { + return StoryBean(parcel) + } + + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } + } + } + + + constructor(parcel: Parcel) : this( + parcel.readString(), + parcel.createTypedArrayList(StoryBean), + parcel.createTypedArrayList(StoryBean)) { + } + + override fun writeToParcel(parcel: Parcel, flags: Int) { + parcel.writeString(date) + parcel.writeTypedList(stories) + parcel.writeTypedList(top_stories) + } + + override fun describeContents(): Int { + return 0 + } + + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): ZhiHuDailyNewsDto { + return ZhiHuDailyNewsDto(parcel) + } + + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } + } +} \ No newline at end of file diff --git a/module/src/main/java/com/heyongrui/module/data/service/DailyLifeService.java b/module/src/main/java/com/heyongrui/module/data/service/DailyLifeService.java index 3545e60..61ec197 100644 --- a/module/src/main/java/com/heyongrui/module/data/service/DailyLifeService.java +++ b/module/src/main/java/com/heyongrui/module/data/service/DailyLifeService.java @@ -1,6 +1,7 @@ package com.heyongrui.module.data.service; import com.heyongrui.module.data.api.DailyLifeApi; +import com.heyongrui.module.data.dto.ZhiHuDailyNewsDto; import com.heyongrui.network.configure.RxHelper; import com.heyongrui.network.service.ApiService; @@ -16,4 +17,35 @@ public Observable getGarbageCategory(String garbage) { .getGarbageCategory(garbage) .compose(RxHelper.rxSchedulerHelper()); } + + /** + * 获取知乎日报最新消息(当天) + */ + public Observable getZhiHuNewsLatest() { + return ApiService.createApi(DailyLifeApi.class, "https://news-at.zhihu.com/api/4/") + .getZhiHuNewsLatest() + .compose(RxHelper.rxSchedulerHelper()); + } + + /** + * 获取知乎日报过往消息 + * + * @param date 格式:20131119,获取的是20131118的消息 + */ + public Observable getZhiHuPastNews(String date) { + return ApiService.createApi(DailyLifeApi.class, "https://news-at.zhihu.com/api/4/") + .getZhiHuPastNews(date) + .compose(RxHelper.rxSchedulerHelper()); + } + + /** + * 获取知乎日报具体消息内容HTML + * + * @param id StoryBean中的id + */ + public Observable getZhiHuNewsHtmlContent(int id) { + return ApiService.createApi(DailyLifeApi.class, "https://news-at.zhihu.com/api/4/") + .getZhiHuNewsHtmlContent(id) + .compose(RxHelper.rxSchedulerHelper()); + } } diff --git a/module/src/main/java/com/heyongrui/module/zhihu/contract/ZhiHuDailyNewsContract.kt b/module/src/main/java/com/heyongrui/module/zhihu/contract/ZhiHuDailyNewsContract.kt new file mode 100644 index 0000000..8c66fcb --- /dev/null +++ b/module/src/main/java/com/heyongrui/module/zhihu/contract/ZhiHuDailyNewsContract.kt @@ -0,0 +1,37 @@ +package com.heyongrui.module.zhihu.contract + +import androidx.recyclerview.widget.RecyclerView +import com.chad.library.adapter.base.BaseQuickAdapter +import com.heyongrui.base.base.BasePresenter +import com.heyongrui.base.base.BaseView +import com.heyongrui.module.adapter.ModuleSectionAdapter +import com.heyongrui.module.data.dto.ZhiHuDailyNewsDto +import com.ms.banner.Banner +import com.scwang.smartrefresh.header.StoreHouseHeader +import com.scwang.smartrefresh.layout.SmartRefreshLayout +import com.scwang.smartrefresh.layout.listener.OnRefreshLoadMoreListener +import java.util.* + +interface ZhiHuDailyNewsContract { + interface View : BaseView { + fun getZhiHuNewsSuccess(zhiHuDailyNewsDto: ZhiHuDailyNewsDto?) + + fun getZhiHuNewsFail(errorCode: Int, errorMsg: String) + } + + abstract class Presenter : BasePresenter() { + abstract fun initSwipeRefresh(smartRefreshLayout: SmartRefreshLayout, storeHouseHeader: StoreHouseHeader, onRefreshLoadMoreListener: OnRefreshLoadMoreListener) + + abstract fun initRecyclerView(recyclerView: RecyclerView, listener: BaseQuickAdapter.OnItemClickListener): ModuleSectionAdapter + + abstract fun getHeaderView(): Banner + + abstract fun setBannerData(banner: Banner, bannersBeanList: List<*>?) + + abstract fun getZhiHuNewsLatest() + + abstract fun getZhiHuPastNews(date: Date) + + abstract fun getZhiHuNewsHtmlContent(id: Int) + } +} \ No newline at end of file diff --git a/module/src/main/java/com/heyongrui/module/zhihu/presenter/ZhiHuDailyNewsPresenter.kt b/module/src/main/java/com/heyongrui/module/zhihu/presenter/ZhiHuDailyNewsPresenter.kt new file mode 100644 index 0000000..3fa34bf --- /dev/null +++ b/module/src/main/java/com/heyongrui/module/zhihu/presenter/ZhiHuDailyNewsPresenter.kt @@ -0,0 +1,165 @@ +package com.heyongrui.module.zhihu.presenter + +import android.content.Context +import android.text.TextUtils +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.alibaba.android.arouter.launcher.ARouter +import com.blankj.utilcode.util.ConvertUtils +import com.blankj.utilcode.util.ScreenUtils +import com.blankj.utilcode.util.ToastUtils +import com.chad.library.adapter.base.BaseQuickAdapter +import com.heyongrui.base.app.BaseApplication +import com.heyongrui.base.assist.ConfigConstants +import com.heyongrui.base.glide.transformations.RoundedCornersTransformation +import com.heyongrui.base.utils.GlideUtil +import com.heyongrui.base.utils.TimeUtil +import com.heyongrui.base.widget.itemdecoration.RecycleViewItemDecoration +import com.heyongrui.module.R +import com.heyongrui.module.adapter.ModuleSectionAdapter +import com.heyongrui.module.adapter.ModuleSectionEntity +import com.heyongrui.module.dagger.DaggerModuleComponent +import com.heyongrui.module.dagger.ModuleModule +import com.heyongrui.module.data.dto.ZhiHuDailyNewsDto +import com.heyongrui.module.data.service.DailyLifeService +import com.heyongrui.module.zhihu.contract.ZhiHuDailyNewsContract +import com.heyongrui.network.configure.ResponseDisposable +import com.ms.banner.Banner +import com.ms.banner.BannerConfig +import com.ms.banner.Transformer +import com.ms.banner.holder.BannerViewHolder +import com.scwang.smartrefresh.header.StoreHouseHeader +import com.scwang.smartrefresh.layout.SmartRefreshLayout +import com.scwang.smartrefresh.layout.listener.OnRefreshLoadMoreListener +import java.util.* +import javax.inject.Inject + + +class ZhiHuDailyNewsPresenter : ZhiHuDailyNewsContract.Presenter() { + + @Inject + lateinit var mDailyLifeService: DailyLifeService + + init { + DaggerModuleComponent.builder().appComponent(BaseApplication.getAppComponent()).moduleModule(ModuleModule()).build().inject(this) + } + + override fun initSwipeRefresh(smartRefreshLayout: SmartRefreshLayout, storeHouseHeader: StoreHouseHeader, onRefreshLoadMoreListener: OnRefreshLoadMoreListener) { + storeHouseHeader.setTextColor(ContextCompat.getColor(mContext, R.color.white)) + smartRefreshLayout.setPrimaryColors(ContextCompat.getColor(mContext, R.color.colorPrimaryDark)) + smartRefreshLayout.setDisableContentWhenRefresh(true)//是否在刷新的时候禁止列表的操作 + smartRefreshLayout.setDisableContentWhenLoading(true)//是否在加载的时候禁止列表的操作 + smartRefreshLayout.setEnableNestedScroll(true) + smartRefreshLayout.setEnableLoadMoreWhenContentNotFull(true) + smartRefreshLayout.setOnRefreshLoadMoreListener(onRefreshLoadMoreListener) + } + + override fun initRecyclerView(recyclerView: RecyclerView, listener: BaseQuickAdapter.OnItemClickListener): ModuleSectionAdapter { + val data = ArrayList() + val moduleSectionAdapter = ModuleSectionAdapter(android.R.layout.simple_list_item_1, data) + recyclerView.layoutManager = LinearLayoutManager(mContext) + moduleSectionAdapter.bindToRecyclerView(recyclerView) + val dp1 = ConvertUtils.dp2px(1f) + recyclerView.addItemDecoration(RecycleViewItemDecoration(mContext, dp1)) + moduleSectionAdapter.setSpanSizeLookup({ gridLayoutManager, position -> data[position].getSpanSize() }) + if (null != listener) { + moduleSectionAdapter.setOnItemClickListener(listener) + } + return moduleSectionAdapter + } + + override fun getHeaderView(): Banner { + var banner = Banner(mContext) + val height = ScreenUtils.getScreenWidth() / 2 + banner.layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, height) + banner.setDelayTime(5000) + banner.setAutoPlay(true) + return banner + } + + override fun setBannerData(banner: Banner, bannersBeanList: List<*>?) { + if (bannersBeanList == null || bannersBeanList.isEmpty()) return + banner.setPages(bannersBeanList, object : BannerViewHolder { + + lateinit var photoIv: ImageView + + override fun onBind(context: Context?, position: Int, data: Any?) { + if (data != null && data is ZhiHuDailyNewsDto.StoryBean) { + var photo_url = data.image + photo_url = if (TextUtils.isEmpty(photo_url)) "" else photo_url + GlideUtil.loadRound(context, photo_url, photoIv, 20, RoundedCornersTransformation.CornerType.ALL, R.drawable.placeholder) + } + } + + override fun createView(context: Context?): View { + photoIv = ImageView(context) + photoIv.setLayoutParams(ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)) + photoIv.setScaleType(ImageView.ScaleType.CENTER_CROP) + return photoIv + } + + }) + banner.setBannerAnimation(Transformer.Tablet) + banner.setIndicatorGravity(BannerConfig.CENTER) + banner.setBannerStyle(BannerConfig.CIRCLE_INDICATOR) + banner.setOnBannerClickListener { datas, position -> + var item = datas[position] + if (item != null) { + if (item is ZhiHuDailyNewsDto.StoryBean) { + ARouter.getInstance().build(ConfigConstants.PATH_H5).withString("h5Url", "http://daily.zhihu.com/story/${item.id}").navigation() +// getZhiHuNewsHtmlContent(item.id) + } + } + } + banner.start() + } + + override fun getZhiHuNewsLatest() { + mRxManager.add(mDailyLifeService.getZhiHuNewsLatest().subscribeWith( + object : ResponseDisposable(mContext, true) { + override fun onSuccess(zhiHuDailyNewsDto: ZhiHuDailyNewsDto) { + mView?.getZhiHuNewsSuccess(zhiHuDailyNewsDto) + } + + override fun onFailure(errorCode: Int, errorMsg: String) { + mView?.getZhiHuNewsFail(errorCode, errorMsg) + } + })) + } + + override fun getZhiHuPastNews(date: Date) { + if (null == date) return + try { + var dateStr = TimeUtil.getDateString(date, "yyyyMMdd") + mRxManager.add(mDailyLifeService.getZhiHuPastNews(dateStr).subscribeWith( + object : ResponseDisposable(mContext, true) { + override fun onSuccess(zhiHuDailyNewsDto: ZhiHuDailyNewsDto) { + mView?.getZhiHuNewsSuccess(zhiHuDailyNewsDto) + } + + override fun onFailure(errorCode: Int, errorMsg: String) { + mView?.getZhiHuNewsFail(errorCode, errorMsg) + } + })) + } catch (e: Exception) { + e.printStackTrace() + } + } + + override fun getZhiHuNewsHtmlContent(id: Int) { + mRxManager.add(mDailyLifeService.getZhiHuNewsHtmlContent(id).subscribeWith( + object : ResponseDisposable(mContext, false) { + override fun onSuccess(any: Any) { + + } + + override fun onFailure(errorCode: Int, errorMsg: String) { + ToastUtils.showShort(errorMsg) + } + })) + } +} \ No newline at end of file diff --git a/module/src/main/java/com/heyongrui/module/zhihu/view/ZhiHuDailyNewsActivity.kt b/module/src/main/java/com/heyongrui/module/zhihu/view/ZhiHuDailyNewsActivity.kt new file mode 100644 index 0000000..921135d --- /dev/null +++ b/module/src/main/java/com/heyongrui/module/zhihu/view/ZhiHuDailyNewsActivity.kt @@ -0,0 +1,148 @@ +package com.heyongrui.module.zhihu.view + +import android.os.Bundle +import android.view.View +import androidx.core.content.ContextCompat +import com.alibaba.android.arouter.facade.annotation.Route +import com.alibaba.android.arouter.launcher.ARouter +import com.blankj.utilcode.util.ToastUtils +import com.chad.library.adapter.base.BaseQuickAdapter +import com.heyongrui.base.assist.ConfigConstants +import com.heyongrui.base.base.BaseActivity +import com.heyongrui.base.utils.DrawableUtil +import com.heyongrui.base.utils.TimeUtil +import com.heyongrui.module.R +import com.heyongrui.module.adapter.ModuleSectionAdapter +import com.heyongrui.module.adapter.ModuleSectionEntity +import com.heyongrui.module.data.dto.ZhiHuDailyNewsDto +import com.heyongrui.module.zhihu.contract.ZhiHuDailyNewsContract +import com.heyongrui.module.zhihu.presenter.ZhiHuDailyNewsPresenter +import com.ms.banner.Banner +import com.scwang.smartrefresh.layout.api.RefreshLayout +import com.scwang.smartrefresh.layout.listener.OnRefreshLoadMoreListener +import kotlinx.android.synthetic.main.activity_zhihu_daily_news.* +import java.util.* + +@Route(path = ConfigConstants.PATH_ZHIHU_DAILY_NEWS) +class ZhiHuDailyNewsActivity : BaseActivity(), + ZhiHuDailyNewsContract.View, View.OnClickListener, OnRefreshLoadMoreListener, + BaseQuickAdapter.OnItemClickListener { + + var mCalendar = Calendar.getInstance() + lateinit var mZhiHuAdapter: ModuleSectionAdapter + lateinit var mBanner: Banner + + fun isInitBanner(): Boolean = ::mBanner.isInitialized + + override fun onClick(p0: View?) { + if (p0 != null) { + if (p0 == iv_back) { + finish() + } + } + } + + override fun setPresenter(): ZhiHuDailyNewsContract.Presenter { + return ZhiHuDailyNewsPresenter() + } + + override fun getLayoutId(): Int { + return R.layout.activity_zhihu_daily_news + } + + override fun init(savedInstanceState: Bundle?) { + val tintDrawable = DrawableUtil.tintDrawable(this@ZhiHuDailyNewsActivity, R.drawable.ic_back, + ContextCompat.getColor(this@ZhiHuDailyNewsActivity, R.color.background)) + iv_back.setImageDrawable(tintDrawable) + + addOnClickListeners(this@ZhiHuDailyNewsActivity, iv_back) + + mPresenter.initSwipeRefresh(refresh_layout, store_house_header, this@ZhiHuDailyNewsActivity) + mZhiHuAdapter = mPresenter.initRecyclerView(rlv_zhihu, this@ZhiHuDailyNewsActivity) + + refresh_layout.autoRefresh() + } + + override fun onLoadMore(refreshLayout: RefreshLayout) { + mCalendar.add(Calendar.DAY_OF_MONTH, -1) + getZhiHuNews() + } + + override fun onRefresh(refreshLayout: RefreshLayout) { + mCalendar = Calendar.getInstance() + getZhiHuNews() + } + + override fun onItemClick(adapter: BaseQuickAdapter<*, *>?, view: View?, position: Int) { + var storyBean = mZhiHuAdapter.data.get(position).storyBean + if (storyBean != null) { + ARouter.getInstance().build(ConfigConstants.PATH_H5).withString("h5Url", "http://daily.zhihu.com/story/${storyBean.id}").navigation() +// mPresenter?.getZhiHuNewsHtmlContent(storyBean.id) + } + } + + override fun getZhiHuNewsSuccess(zhiHuDailyNewsDto: ZhiHuDailyNewsDto?) { + resetRefreshLayout(true, true, false) + var addDataList = ArrayList() + var moduleSectionEntity = ModuleSectionEntity(true, TimeUtil.getDateString(mCalendar.time, TimeUtil.DAY_ONE), true) + moduleSectionEntity.itemType = ModuleSectionEntity.ZHIHU_NEWS + addDataList.add(moduleSectionEntity) + var storyBeanList = zhiHuDailyNewsDto?.stories + if (storyBeanList != null) { + for (storyBean in storyBeanList) { + addDataList.add(ModuleSectionEntity(ModuleSectionEntity.ZHIHU_NEWS, storyBean)) + } + } + if (TimeUtil.isSameDay(Date(), mCalendar.time)) { + mZhiHuAdapter.replaceData(addDataList) + if (!isInitBanner()) { + mBanner = mPresenter.getHeaderView() + } + mPresenter?.setBannerData(mBanner, zhiHuDailyNewsDto?.top_stories) + mZhiHuAdapter.setHeaderView(mBanner) + } else { + mZhiHuAdapter.addData(addDataList) + } + } + + override fun getZhiHuNewsFail(errorCode: Int, errorMsg: String) { + ToastUtils.showShort(errorMsg) + resetRefreshLayout(true, true, false) + } + + private fun getZhiHuNews() { + if (TimeUtil.isSameDay(Date(), mCalendar.time)) {//如果是今天,获取最新 + mPresenter?.getZhiHuNewsLatest() + } else {//不是今天,获取往期新闻 + mPresenter?.getZhiHuPastNews(mCalendar.time) + } + } + + private fun resetRefreshLayout(isFinishLoadMore: Boolean, isFinishRefresh: Boolean, noMoreData: Boolean) { + if (isFinishLoadMore) { + refresh_layout.finishLoadMore() + } + if (isFinishRefresh) { + refresh_layout.finishRefresh() + } + refresh_layout.setNoMoreData(noMoreData) + } + + override fun onStart() { + super.onStart() + if (isInitBanner()) { + if (!mBanner.isStart() && mBanner.isPrepare()) { + mBanner.startAutoPlay(); + } + } + } + + override fun onStop() { + super.onStop() + if (isInitBanner()) { + if (mBanner.isStart() && mBanner.isPrepare()) { + mBanner.stopAutoPlay(); + } + } + } +} \ No newline at end of file diff --git a/module/src/main/res/drawable-xhdpi/ic_zhihu.png b/module/src/main/res/drawable-xhdpi/ic_zhihu.png new file mode 100644 index 0000000000000000000000000000000000000000..3d7dbc6295384f9a1c35147879ff0a57c2f42660 GIT binary patch literal 2210 zcmV;T2wnGyP)f5^#5pvgq_zEyB9?W3D(GAMsig*yR({TfkH1kRj?v60-6c2rC}Fo3yR z56a@evDb5YczCjnV#Z^R z8ovTWoYNiCtrY_Jk;(4s$+MX_g7QV*MuTK(#>xW@RO-9=u}wtI%;Cx zGzMTiPoVeZ17OAr0J=d)1KHmZfY;1O4=N*okxM8e$DCy=u2)H;j0L{7%#5*cF1)}<^lE4GKL=XTR z0@LkwGQOo$5|VWD83LAu1t6uY>xucHiUROXd}ffl$|ZV}MB45&H}#jxz_Moi9YiDV z28;=<0+MFjKtvB#6hJv=i#?Y$V?T&43mpN~3P94#r-<<3&;WE}6@eb8x(JYT^REPa zG&BIs{5%nUS%m_+!q0= zFXw#N=NSmg`_-n$Jv}kqx=8@vS8)K6ZnP0-eOTv$$TRqNj+)3Gxy3Z&W`XG5$^z)% z8S;?T3&PwW4uo&RX+0*Udcj*U-MB>n{k)gB*x=Bx!6L4_{b{2opv%YazYePSuACKQDAJVD1d;rjx;-Y{N$Yt4j+LrV~dki zZXK^KSu@vwFuW>w@)bD`7?0uJatRkN`bLegy01m??dXE&tWE&BxfX!$yuhVMV_!?- zD?yyjZzC7eRjEVKpvFtO`2Yc{M%wf1wwhQNRNewL| zSu?+4&yJ*UOXKmNFeKf&mB1ZU1EARaXGW3;3V<(XOK4i+EAl^pmVzN^Ml%s@t{MQv zKAkbJ&v!Ne{(-F~z7r%0su6(yGdZ* zkRl%_RaPTurb+~D`UB{AZMKwo>oo$RdCOng7L{|*OoOs+eux3@oKWM&~0@VUQ(#;?}H;rDGDy+*YWDfs7;0nOit@qPn$IWPTKc^GYSxYzmr4jZmRdS+l+l;-3~V zu+>o&U-HVe@m{ZM#p5p!NG?cjpX^f=U**SG06e)2@yh;|#BlwP_ujx@Ex&lP6ok+K zJlX=g`$rc{aoQH^7L1kHJfmXm#wSRiC-ReGp+nhrDPx1cba(OS!!|pqti{d)HBxWw zRswD;H|oA94HE%%DXXEz{jEQN+mjt4p4Yy;u-cH7S^@pR{m*{dGpL#y=2-wzHFC7>E<|~28DP~!&lQi=lBCN}`WAO8?NZ0f?D_!Me%RL_xz}!^#2Sv{8CScJR38`l=;$EC? zUea5xlVZ5|Ae-`F-K0Py`sOH`jg5ZgE$tn%_soT&Bk&eLyw)R5Ax|@;3;Bivky1z zI_>`w(GJy3G|`oUQ8WVT+RS;82rlpnHwnCiTzd7G= - - + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/module/src/main/res/layout/recycle_item_zhihu_news.xml b/module/src/main/res/layout/recycle_item_zhihu_news.xml new file mode 100644 index 0000000..8a8321c --- /dev/null +++ b/module/src/main/res/layout/recycle_item_zhihu_news.xml @@ -0,0 +1,37 @@ + + + + + + + + \ No newline at end of file diff --git a/module/src/main/res/values/strings.xml b/module/src/main/res/values/strings.xml index 01c6b9d..2a77d23 100644 --- a/module/src/main/res/values/strings.xml +++ b/module/src/main/res/values/strings.xml @@ -63,6 +63,7 @@ 有害垃圾投放要求 投放时请注意轻放;易破损的请连带包装或包裹后轻放;如易挥发,请密封后投放 电影 + 知乎日报 电视剧 热度 时间 diff --git a/module2/src/main/res/layout/activity_leisure_read.xml b/module2/src/main/res/layout/activity_leisure_read.xml index 18c63ce..e798a09 100644 --- a/module2/src/main/res/layout/activity_leisure_read.xml +++ b/module2/src/main/res/layout/activity_leisure_read.xml @@ -28,7 +28,7 @@ app:layout_constraintTop_toTopOf="parent" tools:tint="@color/white" /> -