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

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://xiahunao.cn/news/2803577.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

无线听觉新体验:南卡、韶音、墨觉骨传导耳机综合评测

作为一个资深的跑步爱好者&#xff0c;我几乎离不开音乐的陪伴。不知道大家有没有同感&#xff0c;有时候一首歌曲就是我坚持下去的动力&#xff0c;尤其是在那段艰难的跑步时刻。但是找到一款既能让我在运动中自由呼吸、又能提供优质音乐体验的耳机&#xff0c;并不是一件容易…

Redis(十五)Bitmap、Hyperloglog、GEO案例、布隆过滤器

文章目录 面试题常见统计类型聚合统计排序统计二值统计基数统计 Hyperloglog专有名词UV&#xff08;Unique Visitor&#xff09;独立访客PV&#xff08;Page View&#xff09;页面浏览量DAU&#xff08;Daily Active User&#xff09;日活跃用户量MAU&#xff08;Monthly Activ…

人工智能 — 数字图像

目录 一、图像1、像素2、图像分辨率3、RGB 模型4、灰度5、通道6、对比度7、RGB 转化为 Gray8、RGB 值转化为浮点数9、二值化10、常用视觉库11、频率12、幅值 二、图像的取样与量化1、数字图像2、取样3、量化 三、上采样与下采样1、上采样&#xff08;upsampling&#xff09;2、…

Encoder-decoder 与Decoder-only 模型之间的使用区别

承接上文&#xff1a;Transformer Encoder-Decoer 结构回顾 笔者以huggingface T5 transformer 对encoder-decoder 模型进行了简单的回顾。 由于笔者最近使用decoder-only模型时发现&#xff0c;其使用细节和encoder-decoder有着非常大的区别&#xff1b;而huggingface的接口为…

解决SpringAMQP工作队列模型程序报错:WARN 48068:Failed to declare queue: simple.queue

这里写目录标题 1.运行环境2.报错信息3.解决方案4.查看解决之后的效果 1.运行环境 使用docker运行了RabbitMQ的服务器&#xff1a; 在idea中导入springAMQP的jar包&#xff0c;分别编写了子模块生产者publisher&#xff0c;消费者consumer&#xff1a; 1.在publisher中运行测试…

Excel Ctrl + E快捷键 批量合并提取数据

目录 一. 合并数据二. 提取数据 Ctrl L 只是快捷键&#xff0c;在数据面板中有快速填充的按钮。 一. 合并数据 &#x1f914;有如图所示的数据&#xff0c;现在想批量的把姓名和电话合在一起 &#x1f9d0;先把要处理的数据手动复制到一起&#xff0c;然后按下 Ctrl E 就可以…

Element table 实现表格行、列拖拽功能

安装包 npm install sortablejs --save <template><div class"draggable" style"padding: 20px"><el-table row-key"id" :data"tableData" style"width: 100%" border><el-table-columnv-for"(it…

【C++私房菜】面向对象中的多重继承以及菱形继承

文章目录 一、多重继承1、多重继承概念2、派生类构造函数和析构函数 二、菱形继承和虚继承2、虚继承后的构造函数和析构函数 三、has-a 与 is-a 一、多重继承 1、多重继承概念 **多重继承&#xff08;multiple inheritance&#xff09;**是指从多个直接基类中产生派生类的能力…

Stable Diffusion 模型分享:AstrAnime(Astr动画)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五 下载地址 模型介绍 AstrAnime 是一个动漫模型&#xff0c;画风色彩鲜明&#xff0c;擅长绘制漂亮的小姐姐。 条目内容类型大模型…

uniapp实现全局悬浮框

uniapp实现全局悬浮框(按钮,页面,图片自行设置) 可拖动 话不多说直接上干货 1,在components新建组件(省去了每个页面都要引用组件的麻烦) 2,实现代码 <template><view class"call-plate" :style"top: top px;left: left px;" touchmove&quo…

【目标检测新SOTA!v7 v4作者新作!】YOLO v9 思路复现 + 全流程优化

YOLO v9 思路复现 全流程优化 提出背景&#xff1a;深层网络的 信息丢失、梯度流偏差YOLO v9 设计逻辑可编程梯度信息&#xff08;PGI&#xff09;&#xff1a;使用PGI改善训练过程广义高效层聚合网络&#xff08;GELAN&#xff09;&#xff1a;使用GELAN改进架构 对比其他解法…

V2X与ETC到底有什么不同?

作者介绍 新春假期刚刚结束&#xff0c;大家在返程路上是否会因为堵车发愁&#xff1f;尤其是在假期结束后高速不再免费&#xff0c;人工收费口大排长队&#xff0c;这时大家是否会感慨ETC&#xff08;Electronic Toll Collection&#xff0c;电子不停车收费&#xff09;技术为…

如何在Shopee平台上优化饰品类目选品?

在Shopee这样竞争激烈的电商平台上&#xff0c;针对饰品类目进行选品是一项需要精心策划和执行的任务。卖家们需要通过深入的市场分析和精准的策略&#xff0c;才能在激烈的竞争中脱颖而出&#xff0c;提高产品的曝光度和销售业绩。下面将介绍一些在Shopee平台上优化饰品类目选…

【高德地图】Android搭建3D高德地图详细教

&#x1f4d6;Android搭建3D高德地图详细教程 &#x1f4d6;第1章 高德地图介绍✅了解高德地图✅2D地图与3D地图 &#x1f4d6;第2章 搭建3D地图并显示✅第 1 步&#xff1a;创建 Android 项目✅第 2 步&#xff1a;获取高德Key✅第 3 步&#xff1a;下载地图SDK✅第 4 步&…

发现了一个超赞的办公利器!ONLYOFFICE 文档 8.0 强势登场!

迎接 ONLYOFFICE 文档 v8.0发布后的全新升级&#xff01;现在&#xff0c;适用于 Linux、Windows 和 macOS 的免费 ONLYOFFICE 桌面应用程序更加强大&#xff01;全新的 RTL 界面、本地界面主题、与 Moodle 的集成等实用功能&#xff0c;让你的办公体验更加出色&#xff01;全新…

system V 共享内存

1.共享内存的原理 要理解共享内存的原理&#xff0c;首先我们得记起进程间通信的前提&#xff1a;必须让不同的进程看到同一份资源&#xff08;必须由OS提供&#xff09; 我们都知道进程都会有自己的进程地址空间&#xff0c;然后都会通过页表与物理内存进行映射&#xff0c;…

springboot214基于springboot的多媒体素材库的开发与应用

多媒体素材库的设计与实现 摘要 近年来&#xff0c;信息化管理行业的不断兴起&#xff0c;使得人们的日常生活越来越离不开计算机和互联网技术。首先&#xff0c;根据收集到的用户需求分析&#xff0c;对设计系统有一个初步的认识与了解&#xff0c;确定多媒体素材库的总体功…

vue源码分析之nextTick源码分析-逐行逐析-错误分析

nextTick的使用背景 在vue项目中&#xff0c;经常会使用到nextTick这个api&#xff0c;一直在猜想其是怎么实现的&#xff0c;今天有幸研读了下&#xff0c;虽然源码又些许问题&#xff0c;但仍值得借鉴 核心源码解析 判断当前环境使用最合适的API并保存函数 promise 判断…

SD-WAN组网:打造跨国企业无缝网络连接体验

在数字化转型的时代&#xff0c;越来越多的企业迈向国际化&#xff0c;然而&#xff0c;由于自建网络架构的限制和跨域网络的复杂性&#xff0c;企业在不同地理位置的站点之间难以实现高效的数据互通和协作。这就是为什么SD-WAN成为跨国企业组网的理想选择的原因。 跨国企业常见…

你真的了解nsight compute中的Roofline Charts吗?

此文章是之前看nsight-compute官网的时候做的笔记。因为这个记笔记的时候使用的文档记录下来会更直观好看&#xff0c;所以本次的笔记采用了截图的方式。中英文是方便沟通记忆&#xff0c;概念对齐。