小说阅读软件书架界面和历史记录界面

2024-02-23 21:44

本文主要是介绍小说阅读软件书架界面和历史记录界面,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、引言

        终于修改到书架界面和历史阅读记录界面了,修改完这两个界面就算完成一大半了,这两个界面其实都差不多,代码逻辑都一样,因此后面也会只展示书架界面的代码,历史阅读记录界面就展示效果图就行了。

2、实现代码

2.1、书架界面主布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/rl_shelf"android:background="#ffffff"><RelativeLayoutandroid:id="@+id/rl_book_top"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="#00000000"android:layout_marginTop="10dp"><TextViewandroid:id="@+id/tv_book"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginVertical="10dp"android:layout_marginLeft="10dp"android:text="书架"android:textColor="#303030"android:textSize="20sp"android:textStyle="bold" /><ImageViewandroid:id="@+id/iv_search"android:layout_width="18dp"android:layout_height="18dp"android:layout_marginRight="35dp"android:layout_centerVertical="true"android:layout_alignParentRight="true"android:background="@drawable/search_shelf"/><TextViewandroid:id="@+id/tv_exit"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="20sp"android:layout_marginRight="35dp"android:text="退出管理"android:textColor="#303030"android:visibility="gone"android:layout_centerVertical="true"android:layout_alignParentRight="true"/></RelativeLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_below="@id/rl_book_top"android:orientation="vertical"><ImageViewandroid:id="@+id/iv_shelf_line"android:layout_width="match_parent"android:layout_height="1dp"android:background="#c5c5c5"/><GridViewandroid:id="@+id/gv_shelf"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginTop="15dp"android:verticalSpacing="10dp"android:numColumns="3"></GridView></LinearLayout><RelativeLayoutandroid:id="@+id/Rl_book_bottom"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="#f5f5f5"android:visibility="gone"android:layout_alignParentBottom="true"><TextViewandroid:id="@+id/tv_book_select"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="全选"android:textSize="20sp"android:layout_marginLeft="15dp"android:layout_marginVertical="15dp"android:layout_centerVertical="true"android:textColor="#606060"/><TextViewandroid:id="@+id/tv_book_delete"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:text="删除"android:textSize="20sp"android:layout_marginRight="15dp"android:layout_centerVertical="true"android:textColor="#ff0000"/></RelativeLayout>
</RelativeLayout>

2.2、书架界面实际布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#ffffff"><ImageViewandroid:id="@+id/iv_grid"android:layout_width="90dp"android:layout_height="125dp"android:layout_centerHorizontal="true"android:background="@drawable/empty"/><LinearLayoutandroid:id="@+id/ll_content"android:layout_width="100dp"android:layout_below="@+id/iv_grid"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:gravity="center_horizontal"><TextViewandroid:id="@+id/tv_grid"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="15sp"android:layout_marginTop="5dp"android:textColor="#303030"android:text="书名"/></LinearLayout><ImageViewandroid:id="@+id/iv_select"android:layout_width="25dp"android:layout_height="25dp"android:layout_alignBottom="@+id/iv_grid"android:layout_alignRight="@+id/iv_grid"android:layout_marginRight="5dp"android:layout_marginBottom="5dp"android:visibility="gone"android:background="@drawable/checkbox_ic_default"/>
</RelativeLayout>

2.3、逻辑代码

        在这里其实还要配合上次阅读界面那里添加书架和历史记录查看,但上次那里没修改,不过没太大变化,可以参考上次阅读界面那里。

package xyz.dritrtj.read.fragment;import android.annotation.SuppressLint;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;import androidx.annotation.NonNull;import xyz.dritrtj.read.R;
import xyz.dritrtj.read.base.BaseFragment;
import xyz.dritrtj.read.data.Title;
import xyz.dritrtj.read.ui.MainActivity;
import xyz.dritrtj.read.ui.ReadActivity;
import xyz.dritrtj.read.ui.SearchActivity;
import xyz.dritrtj.read.utils.DBHelper;
import xyz.dritrtj.read.utils.SetUiSize;import java.util.ArrayList;
import java.util.List;
/*** 书架的展示页面*/
public class BookShelfFragment extends BaseFragment implements View.OnClickListener {public static BookShelfFragment fragment;private RelativeLayout rl_shelf;private RelativeLayout rl_book_top;private TextView tv_book;private ImageView iv_search;private TextView tv_exit;private ImageView iv_shelf_line;private GridView gv_shelf;private RelativeLayout Rl_book_bottom;private TextView tv_book_select;private TextView tv_book_delete;@Overrideprotected View initView() {View view=View.inflate(context, R.layout.book_shelf_fragment,null);rl_shelf = view.findViewById(R.id.rl_shelf);rl_book_top = view.findViewById(R.id.rl_book_top);tv_book = view.findViewById(R.id.tv_book);iv_search = view.findViewById(R.id.iv_search);iv_search.setOnClickListener(this);tv_exit = view.findViewById(R.id.tv_exit);tv_exit.setOnClickListener(this);iv_shelf_line = view.findViewById(R.id.iv_shelf_line);gv_shelf = view.findViewById(R.id.gv_shelf);Rl_book_bottom = view.findViewById(R.id.Rl_book_bottom);tv_book_select = view.findViewById(R.id.tv_book_select);tv_book_select.setOnClickListener(this);tv_book_delete = view.findViewById(R.id.tv_book_delete);tv_book_delete.setOnClickListener(this);fragment=this;return view;}/*** 重新设置尺寸*/private void setView(){SetUiSize.setMarginTopRelative(rl_book_top,10);SetUiSize.setTextViewSize(tv_book,20);SetUiSize.setMarginLeftRelative(tv_book,10);SetUiSize.setMarginVerticalRelative(tv_book,10);SetUiSize.setWidthRelative(iv_search,18);SetUiSize.setHeightRelative(iv_search,18);SetUiSize.setMarginRightRelative(iv_search,35);SetUiSize.setTextViewSize(tv_exit,20);SetUiSize.setMarginRightRelative(tv_exit,35);SetUiSize.setHeightLinear(iv_shelf_line,1);SetUiSize.setMarginTopLinear(gv_shelf,15);SetUiSize.setTextViewSize(tv_book_select,20);SetUiSize.setMarginLeftRelative(tv_book_select,15);SetUiSize.setMarginVerticalRelative(tv_book_select,15);SetUiSize.setTextViewSize(tv_book_delete,20);SetUiSize.setMarginRightRelative(tv_book_delete,15);rl_shelf.setVisibility(View.VISIBLE);}@Overrideprotected void initData() {super.initData();setView();query();}@SuppressLint("NonConstantResourceId")@Overridepublic void onClick(View v) {switch (v.getId()){case R.id.iv_search://搜索startActivity(new Intent(getActivity(), SearchActivity.class));break;case R.id.tv_exit://退出管理handler.sendEmptyMessage(1);//刷新书架,取消选择break;case R.id.tv_book_select://全选和取消全选isCheck();break;case R.id.tv_book_delete://从书架中删除小说delete();break;}}/*** 判断是否选中*/private void isCheck() {boolean flag;if (count()){flag=true;tv_book_select.setText("取消全选");}else {flag=false;tv_book_select.setText("全选");}for (int i = 0; i < list.size(); i++) {list.get(i).select=flag;}adapter.notifyDataSetChanged();}private List<Title> list=new ArrayList<>();private ShelfAdapter adapter=new ShelfAdapter();public class ShelfAdapter extends BaseAdapter{@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {Holder holder=null;if (convertView==null){convertView=View.inflate(getActivity(),R.layout.grid_item_shelf,null);holder=new Holder();holder.iv_grid = convertView.findViewById(R.id.iv_grid);SetUiSize.setWidthRelative(holder.iv_grid,90);SetUiSize.setHeightRelative(holder.iv_grid,125);holder.ll_content = convertView.findViewById(R.id.ll_content);SetUiSize.setWidthRelative(holder.ll_content,100);holder.tv_grid = convertView.findViewById(R.id.tv_grid);SetUiSize.setTextViewSize(holder.tv_grid,15);SetUiSize.setMarginTopLinear(holder.tv_grid,5);holder.iv_select = convertView.findViewById(R.id.iv_select);SetUiSize.setWidthRelative(holder.iv_select,25);SetUiSize.setHeightRelative(holder.iv_select,25);SetUiSize.setMarginRightRelative(holder.iv_select,5);SetUiSize.setMarginBottomRelative(holder.iv_select,5);convertView.setTag(holder);}else {holder= (Holder) convertView.getTag();}Title title = list.get(position);getBitmapFromSd(position);holder.iv_grid.setImageBitmap(title.bitmap);holder.tv_grid.setText(title.name);if (MainActivity.activity.exit){if (title.select){holder.iv_select.setBackgroundResource(R.drawable.checkbox_ic_selected);}else {holder.iv_select.setBackgroundResource(R.drawable.checkbox_ic_default);}holder.iv_select.setVisibility(View.VISIBLE);}else {holder.iv_select.setVisibility(View.GONE);}return convertView;}private class Holder{public ImageView iv_grid;public TextView tv_grid;public ImageView iv_select;public LinearLayout ll_content;}}/*** 查询书架数据*/@SuppressLint("Range")private void query(){list.clear();DBHelper dbHelper=new DBHelper(getActivity(),1);SQLiteDatabase database = dbHelper.getReadableDatabase();String sql="CREATE TABLE IF NOT EXISTS shelf(\n" +"\tbook VARCHAR(20) NOT NULL,\n" +"\tauthor VARCHAR(30) NOT NULL,\n" +"\tintroduce VARCHAR(200),\n" +"\tpage VARCHAR(100),\n" +"\torigin VARCHAR(100) NOT NULL,\n" +"\tprogress INTEGER NOT NULL\n" +");";database.execSQL(sql);Cursor cursor = database.query("shelf", null, null,null, null, null, null);Title title;while (cursor.moveToNext()){title = new Title();title.iv_back=R.drawable.empty;title.name=cursor.getString(cursor.getColumnIndex("book"));//书名title.author=cursor.getString(cursor.getColumnIndex("author"));//作者title.path=cursor.getString(cursor.getColumnIndex("origin"));title.index=cursor.getInt(cursor.getColumnIndex("progress"));title.imageName=cursor.getString(cursor.getColumnIndex("page"));list.add(title);}cursor.close();database.close();gv_shelf.setAdapter(adapter);gv_shelf.setOnItemClickListener((parent, view, position, id) -> {if (MainActivity.activity.exit){list.get(position).select=!list.get(position).select;count();adapter.notifyDataSetChanged();}else {Intent intent=new Intent(getActivity(), ReadActivity.class);intent.putExtra("url",list.get(position).path);//章节页面intent.putExtra("name",list.get(position).name);//书名intent.putExtra("author",list.get(position).author);//作者intent.putExtra("code","1");//表示是书架来源intent.putExtra("page",list.get(position).index+"");//表示是阅读进度startActivity(intent);}});gv_shelf.setOnItemLongClickListener((parent, view, position, id) -> {if (!MainActivity.activity.exit){//表示没有选中状态MainActivity.activity.exit=true;//设置为选中状态list.get(position).select=true;iv_search.setVisibility(View.GONE);//隐藏搜索tv_exit.setVisibility(View.VISIBLE);//显示退出管理MainActivity.activity.rg_main.setVisibility(View.GONE);//隐藏底部导航按钮Rl_book_bottom.setVisibility(View.VISIBLE);//显示底部按钮count();adapter.notifyDataSetChanged();//刷新视图return true;}return false;});}@SuppressLint("HandlerLeak")public Handler handler=new Handler(){@Overridepublic void handleMessage(@NonNull Message msg) {super.handleMessage(msg);switch (msg.what){case 0://刷新书架{query();}break;case 1://刷新书架,取消选择{refresh();}break;case 2://删除书架{refresh();query();}break;}}};//刷新书架,取消选择private void refresh() {if (list.size()>0){int i = 0;for (; i < list.size(); i++) {list.get(i).select=false;}}MainActivity.activity.exit=false;tv_exit.setVisibility(View.GONE);//隐藏退出管理iv_search.setVisibility(View.VISIBLE);//显示搜索Rl_book_bottom.setVisibility(View.GONE);//隐藏底部按钮MainActivity.activity.rg_main.setVisibility(View.VISIBLE);//显示底部导航按钮adapter.notifyDataSetChanged();//刷新视图}private void getBitmapFromSd(int position) {// /storage/sdcard/Android/data/packageName/files/String filesPath = getActivity().getExternalFilesDir(null).getAbsolutePath();String filePath = filesPath+"/"+list.get(position).imageName;list.get(position).bitmap=BitmapFactory.decodeFile(filePath);}/*** 统计判断是否修改选择按钮展示文字*/private boolean count(){int i = 0;int flag=0;for (; i < list.size(); i++) {if (list.get(i).select){flag++;}}if (flag<list.size()){tv_book_select.setText("全选");return true;}else if (flag==list.size()){tv_book_select.setText("取消全选");}return false;}/*** 移除小说,并重新加载暑假数据*/private void delete(){DBHelper dbHelper=new DBHelper(getActivity(),1);SQLiteDatabase database = dbHelper.getReadableDatabase();String sql="CREATE TABLE IF NOT EXISTS shelf(\n" +"\tbook VARCHAR(20) NOT NULL,\n" +"\tauthor VARCHAR(30) NOT NULL,\n" +"\tintroduce VARCHAR(200),\n" +"\tpage VARCHAR(100),\n" +"\torigin VARCHAR(100) NOT NULL,\n" +"\tprogress INTEGER NOT NULL\n" +");";database.execSQL(sql);int i = 0;for (; i < list.size(); i++) {if (list.get(i).select){database.delete("shelf","book = ? AND author = ?",new String[]{list.get(i).name,list.get(i).author});}}database.close();//本地保存的图片不删除,用于后面优化复用图片handler.sendEmptyMessage(2);}
}

3、效果演示

3.1、书架效果

        下图是正常情况下书架效果。

        下图是长按后将小说从书架移除的效果。

 

3.2、历史阅读记录效果

 

这篇关于小说阅读软件书架界面和历史记录界面的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/740012

相关文章

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

软件设计师备考——计算机系统

学习内容源自「软件设计师」 上午题 #1 计算机系统_哔哩哔哩_bilibili 目录 1.1.1 计算机系统硬件基本组成 1.1.2 中央处理单元 1.CPU 的功能 1)运算器 2)控制器 RISC && CISC 流水线控制 存储器  Cache 中断 输入输出IO控制方式 程序查询方式 中断驱动方式 直接存储器方式(DMA)  ​编辑 总线 ​编辑

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

免费也能高质量!2024年免费录屏软件深度对比评测

我公司因为客户覆盖面广的原因经常会开远程会议,有时候说的内容比较广需要引用多份的数据,我记录起来有一定难度,所以一般都用录屏工具来记录会议内容。这次我们来一起探索有什么免费录屏工具可以提高我们的工作效率吧。 1.福晰录屏大师 链接直达:https://www.foxitsoftware.cn/REC/  录屏软件录屏功能就是本职,这款录屏工具在录屏模式上提供了多种选项,可以选择屏幕录制、窗口

HomeBank:开源免费的个人财务管理软件

在个人财务管理领域,找到一个既免费又开源的解决方案并非易事。HomeBank&nbsp;正是这样一个项目,它不仅提供了强大的功能,还拥有一个活跃的社区,不断推动其发展和完善。 开源免费:HomeBank 是一个完全开源的项目,用户可以自由地使用、修改和分发。用户友好的界面:提供直观的图形用户界面,使得非技术用户也能轻松上手。数据导入支持:支持从 Quicken、Microsoft Money

PDF 软件如何帮助您编辑、转换和保护文件。

如何找到最好的 PDF 编辑器。 无论您是在为您的企业寻找更高效的 PDF 解决方案,还是尝试组织和编辑主文档,PDF 编辑器都可以在一个地方提供您需要的所有工具。市面上有很多 PDF 编辑器 — 在决定哪个最适合您时,请考虑这些因素。 1. 确定您的 PDF 文档软件需求。 不同的 PDF 文档软件程序可以具有不同的功能,因此在决定哪个是最适合您的 PDF 软件之前,请花点时间评估您的

软件架构模式:5 分钟阅读

原文: https://orkhanscience.medium.com/software-architecture-patterns-5-mins-read-e9e3c8eb47d2 软件架构模式:5 分钟阅读 当有人潜入软件工程世界时,有一天他需要学习软件架构模式的基础知识。当我刚接触编码时,我不知道从哪里获得简要介绍现有架构模式的资源,这样它就不会太详细和混乱,而是非常抽象和易

梳理2024年,螺丝钉们爱用的3款剪辑软件

这年头,视频到处都是,就跟天上的星星一样数不清。不管你是公司里的新面孔,还是职场上的老狐狸,学会怎么剪视频,就好比找到了赢的秘诀。不管是给上司汇报工作,展示你的产品,还是自己搞点小视频记录生活,只要是剪辑得漂亮,肯定能一下子吸引大家的目光,让人记得你。咱们今天就来侃侃现在超火的三款视频剪辑工具,尤其是PR剪辑,你肯定听说过,这货在剪辑界可是大名鼎鼎,用它剪视频,既专业又麻利。 NO1. 福昕轻松

秒变高手:玩转CentOS 7软件更换的方法大全

在 CentOS 7 中更换软件源可以通过以下步骤完成。更换源可以加快软件包的下载速度,特别是当默认源速度较慢时。以下是详细步骤: 前言 为了帮助您解决在使用CentOS 7安装不了软件速度慢的问题,我们推出了这份由浪浪云赞助的教程——“CentOS7如何更换软件源加快下载速度”。 浪浪云,以他们卓越的弹性计算、云存储和网络服务受到广泛好评,他们的支持和帮助使得我们可以将最前沿的技术知识分