这个问题困扰我挺久了,android端找不到一款好的RSS阅读器。我就想简简单单打开自己订阅的RSS每天看一看,没有注册,没有广告,就简简单单的。终于抽了两天时间出来写了个BETA。
所有代码都放在我的Github上了。
记录一下开发过程中遇到的一些问题。
1. RecyclerView处在ConstraintLayout中出现的视图问题
视图的问题如图。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TwCD6atd-1587400775279)(http://img.blog.csdn.net/20170602222804432?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGVpc2VqaXVodWNoZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]
在adapter
的onCreateViewHolder()
方法中,就是按照
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.rss_list_item, parent, false);
这样来写的。子视图的高度也都是确定的。如果这么简单就好了。问题照旧。
尝试了很久,结果症结出在ConstraintLayout
和RecyclerView
一起使用上。
上图中是一个fragment,有问题的fragment的根布局如下:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/fragment_bg"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:id="@+id/rssRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
</android.support.constraint.ConstraintLayout>
因为其他很多地方我都排查过了,所以对这个布局心生怀疑。
我就把ConstraintLayout
改成了FrameLayout
,修改后的布局如下:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/fragment_bg"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:id="@+id/rssRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
</android.support.constraint.ConstraintLayout>
问题解决。
2. 对RSS的XML文档的解析
读取RSS中的内容其实就是解析一下XML文档。
RSS的格式有个大概的标准,大致就是<channel>
或者<rss>
开头,然后是最外层的<title>, <link>, <description>
的内容;紧接着就是<item>
,代表每个子条目;每个<item>
标签中也有相应的<title>, <link>, <description>
节点。
比较了feed.yeeyan.org/select
,zhihu.com/rss
,http://www.read.org.cn/feed
以及feed.androidauthority.com
四个RSS,发现有三个问题:
<link>
标签的内容,可能包含在<link>
的属性中,如:<link href="http://...">
<description>
标签有时候又叫<subtitle>
<item>
标签有时候又叫<entry>
因此在解析的时候,将这三个问题考虑进去,大部分的RSS应该都能解析了。
简单的应用,使用sqlite作为本地存储,如果重复添加已有的RSS,就相当于刷新RSS的内容。
目前还只有简单的添加RSS,浏览其内容的功能。
陆续还会抽空把刷新,进度条和 RSS补全库等功能加上。
代码希望对大家有用。有需要改进的地方,可以邮件我或者ISSUE。
上个截图: