我的首个电子书软件--嘎嘎读书 的开发(二)

        接上篇文章讲,书架页。
       书架是电子书软件中不可缺少的一个页面。主要承担书目索引的功能,嘎嘎读书现阶段书架的功能比较简单,只有显示所有图书,和图书删除功能,未来可能需要添加的功能是添加 分类 批量操作 链接简介页等功能。
       首先处理布局问题,编写书架代码的时候,我还没有用过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就又重要了一分,所以我还是把这个比较重要的类的介绍留到下一篇文章好了。大家晚安~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值