接上篇文章讲,书架页。
书架是电子书软件中不可缺少的一个页面。主要承担书目索引的功能,嘎嘎读书现阶段书架的功能比较简单,只有显示所有图书,和图书删除功能,未来可能需要添加的功能是添加 分类 批量操作 链接简介页等功能。
首先处理布局问题,编写书架代码的时候,我还没有用过gridview,后来才发现其实gridview才是处理书架布局的最佳选择,但是因为那时已经写好了,所以我在这里也依然用我开发中使用的listview来说明。明白gridview的童鞋可以试着用gridview来实现下。接下来是我使用的布局文件的关于书架的布局部分。
以上是书架的整体布局 下面是书架头部布局,以include方式引入
布局主要包含两部分 书架头部和书架主体,书架头部是左中右结构分别为菜单按钮 标题 还有推荐按钮。主体部分是一个listview,listview的每一个item布局文件如下:
布局中 主要是一个相对布局 底层是阴影,是书的背景,中层是书的封面,外层是书的更新标记。以上布局组合起来就是一个完整的书架。正如上文中说的,这种布局显然不是最明智与方便的,因为gridview会更适合这种方块布局。但我会接着按照listview的形式说完成书架的展示功能。
1.构造一种可以便于存储每本书籍信息的模型,也就是我们通常mvc中的model,我取名叫BookBean ,记录一本书的各种所需要的信息。
2.构造一种可持久化的容器存储书架中书籍的信息。
第一个问题很容易解决,我构造的书籍bean包含字段 :书籍id 书籍名 作者名 封面 描述 最新章节 连载状态 更新状态 阅读状态 数据来源 目录信息等。中间有些字段可以缺省。然后用eclipse帮我生成getset方法 代码如下:
package com.prince.gagareader.bean;
import java.util.List;
public class BookBean {
private String nid; //小说nid
private String novelName; //小说名
private String fengmianUrl; //小说的封面图片 url
private String author; //作者
private String des; //描述
private String lastChapter; //最新章节
private int state; //连载 完结状态
private int allChapterCount; //更新到最新多少话
private int currentCount; //当前阅读到
private String sourceSite; //来源
private List
indexList; //目录中文
private boolean isOnline; //是否是在线阅读,在线阅读 和 离线阅读,离线阅读是将当前书籍的文本保存在手机中,在线阅读则是每次从网络获取书籍内容,保存至本地
public String getFengmianUrl() {
return fengmianUrl;
}
public void setFengmianUrl(String fengmianUrl) {
this.fengmianUrl = fengmianUrl;
}
public boolean isOnline() {
return isOnline;
}
public void setOnline(boolean isOnline) {
this.isOnline = isOnline;
}
public String getNovelName() {
return novelName;
}
public void setNovelName(String novelName) {
this.novelName = novelName;
}
public String getNid() {
return nid;
}
public void setNid(String nid) {
this.nid = nid;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public int getAllChapterCount() {
return allChapterCount;
}
public void setAllChapterCount(int allChapterCount) {
this.allChapterCount = allChapterCount;
}
public int getCurrentCount() {
return currentCount;
}
public void setCurrentCount(int currentCount) {
this.currentCount = currentCount;
}
public List
getIndexList() {
return indexList;
}
public void setIndexList(List
indexList) {
this.indexList = indexList;
}
public BookBean(){
nid="14595f0eef119432facf9c8ea24d594d";
novelName="武动乾坤";
fengmianUrl="http://cover.yicha.cn/img/fengmian/20130201/40/93/bd1fdacd1d37a04b8b5b4d5f1d62.jpg";
author="天蚕土豆";
}
public BookBean(String nid){
this.nid=nid;
}
public BookBean(String nid, String novelName, String fengmianUrl,
String author,String des) {
super();
this.nid = nid;
this.novelName = novelName;
this.fengmianUrl = fengmianUrl;
this.author = author;
this.des=des;
}
public BookBean(String nid, String novelName, String fengmianUrl,
String author, String des, String lastChapter, int state,
int allChapterCount) {
super();
this.nid = nid;
this.novelName = novelName;
this.fengmianUrl = fengmianUrl;
this.author = author;
this.des = des;
this.lastChapter = lastChapter;
this.state = state;
this.allChapterCount = allChapterCount;
this.currentCount=1;
this.isOnline=false;
}
public String getDes() {
return des;
}
public void setDes(String des) {
this.des = des;
}
public String getLastChapter() {
return lastChapter;
}
public void setLastChapter(String lastChapter) {
this.lastChapter = lastChapter;
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
public String getSourceSite() {
return sourceSite;
}
public void setSourceSite(String sourceSite) {
this.sourceSite = sourceSite;
}
public String parseToString(String split){
String beanStr="";
beanStr+=nid+split+author+split+des+split+fengmianUrl+split+allChapterCount+split
+currentCount+split+lastChapter+split+state+split+novelName+split+isOnline;
return beanStr;
}
public BookBean(String beanStr,String split){
String[] beanStrs = beanStr.split(split);
nid = beanStrs[0];
author=beanStrs[1];
des = beanStrs[2];
fengmianUrl = beanStrs[3];
allChapterCount = Integer.parseInt(beanStrs[4]);
currentCount = Integer.parseInt(beanStrs[5]);
lastChapter = beanStrs[6];
state = Integer.parseInt(beanStrs[7]);
novelName = beanStrs[8];
isOnline = beanStrs[9].equals("true");
}
public BookBean(String nid,String name,String image,String author){
this.fengmianUrl = image;
this.author =author;
this.novelName = name;
this.nid = nid;
}
public BookBean(String nid,String name,String image,String author,String des,String lastChapter,String sourceSite,int state){
this.fengmianUrl = image;
this.author =author;
this.novelName = name;
this.nid = nid;
this.des =des;
this.lastChapter = lastChapter;
this.sourceSite = sourceSite;
this.state = state;
}
public BookBean(String imgurl,String name,String author,String des,int type){
this.fengmianUrl = imgurl;
this.author =author;
this.novelName = name;
this.des = des;
}
}
第二个问题有点麻烦,我们作为持久层的容器可以有很多选择,比如文件存储,比如数据库。但我毕竟是比较业余的android爱好者,不太会用android上的数据库,写文件的话又要自定义文件内容格式。而且在android上做文件存储调试不太方便。最终我选用SharedPreferences 作为我的持久层容器。关于SharedPreferences的知识大家去别的高手的空间中浏览下吧,总之还是很好用的一种key-value存储容器。我利用SharedPreferences制作了一个书架工具类 取名为SharedPreferencesUtil 主要为书架页提供数据支持,完成加入书架,记录阅读记忆,记录阅读偏好等功能。我把代码贴在下方。大家记得它是一个书架的存储工具类就行了,就是说,有什么加入书架啊,调整书架顺序啊,移除书架这等破遭事都扔给它就可以了。当然你也可以用数据库做一个相同功能的持久层,我也希望有童鞋有兴趣实现一下然后共享给我。
package com.prince.gagareader.util;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.content.SharedPreferences;
import com.prince.gagareader.bean.BookBean;
import com.prince.gagareader.bean.BookMarkBean;
/**
* 主要记忆 书架中的书籍 基本信息 以及每本书阅读记忆 阅读记忆包含 阅读到哪一章 精确到上次离开时
* 阅读页 风格 包含 背景 文字 亮度 开关灯 等标志 暂时不提供加书签的功能
*
* @author gagaprince
*
*/
public class SharedPreferencesUtil {
private static SharedPreferencesUtil self;
public static SharedPreferencesUtil getInstance(){
if(self==null){
self = new SharedPreferencesUtil();
}
return self;
}
private SharedPreferencesUtil(){}
private SharedPreferences sp;
public final String DB_NAME = "gaga_reader";
public final String SPLIT_FLAG="~=~";
public final String BOOK_SPLIT_FLAG="~@~";
public final String BOOK_LIST_KEY = "book_list";
public final String BG_KEY="reader_bg";
public final String FONT_SIZE_KEY="reader_size";
public final String LIGHT_KEY="reader_light";
public final String BOOKMARK_KEY="bookmark";
public final String LASTUPDATETIME="reader_update";
private void initSp(Context c){
if(sp==null){
sp = c.getSharedPreferences(DB_NAME, 0);
}
}
public void removeBookMark(String nid,Context c){
remove(nid+BOOKMARK_KEY, c);
}
public void setBookMark(String nid,int currentCount,int currentPage,Context c){
setString(nid+BOOKMARK_KEY, currentCount+SPLIT_FLAG+currentPage, c);
}
public void setBookMark(String nid,BookMarkBean bookMark,Context c){
setString(nid+BOOKMARK_KEY, bookMark.getCurrentCount()+SPLIT_FLAG+bookMark.getCurrentPage(), c);
}
public int getContextBg(Context c){
return getInt(BG_KEY, c);
}
public void setContextBg(int bgindex,Context c){
setInt(BG_KEY, bgindex, c);
}
public int getContextLight(Context c){
return getInt(LIGHT_KEY, c);
}
public void setContextLight(int bgindex,Context c){
setInt(LIGHT_KEY, bgindex, c);
}
public int getContextFontSize(Context c){
String fontSize = getString(FONT_SIZE_KEY, c);
if("".equals(fontSize))return -1;
return Integer.parseInt(fontSize);
}
public void setContextFontSize(int fontSize,Context c){
setString(FONT_SIZE_KEY, fontSize+"", c);
}
public boolean isBookExist(BookBean bookBean ,Context c){
String nid = bookBean.getNid();
String bookStr = getString(nid, c);
if(!"".equals(bookStr)){
return true;
}
return false;
}
public BookMarkBean getBookMarkByNid(String nid ,Context c){
String bookMarkStr = getString(nid+BOOKMARK_KEY, c);
if("".equals(bookMarkStr)){
return null;
}
String[] bookmarkStrs = bookMarkStr.split(SPLIT_FLAG);
int currentCount = Integer.parseInt(bookmarkStrs[0]);
int currentPage = Integer.parseInt(bookmarkStrs[1]);
return new BookMarkBean(currentCount, currentPage);
}
public void addBookBeanIfExist(BookBean bookBean,Context c){
if(isBookExist(bookBean, c)){
addBookBean(bookBean, c);
}
}
public void removeBookBean(BookBean bookBean,Context c){
if(isBookExist(bookBean, c)){
String nid = bookBean.getNid();
removeBookFromList(c, nid);
remove(nid, c);
BookMarkBean bookMark = getBookMarkByNid(nid, c);
if(bookMark==null){
removeBookMark(nid, c);
}
}
}
public void addBookBean(BookBean bookBean,Context c){
String nid = bookBean.getNid();
String bookStr = bookBean.parseToString(BOOK_SPLIT_FLAG);
setString(nid, bookStr, c);
BookMarkBean bookMark = getBookMarkByNid(nid, c);
if(bookMark==null){
setBookMark(nid, bookBean.getCurrentCount(), 0, c);
}
addBookToList(c, nid);
}
private void removeBookFromList(Context c,String nid){
String nowListStr = getString(BOOK_LIST_KEY, c);
String[] nids = nowListStr.split(SPLIT_FLAG);
int length = nids.length;
StringBuffer sb = new StringBuffer("");
for(int i=0;i
0;i--){
nids[i]=nids[i-1];
}
nids[0]=temp;
StringBuffer sb = new StringBuffer("");
for(int i=0;i
getBookBeanList(Context c){
List
bookBeanList = new ArrayList
();
String[] nids = getBookNidList(c);
for(int i=0;i
有了以上的基础,我们就可以来编写activity类了。但是我同时发现现在时间也不早了,而且接下来要编写的activity和菜单功能竟然是糅合在一起的,这样的话,这个activity就又重要了一分,所以我还是把这个比较重要的类的介绍留到下一篇文章好了。大家晚安~