在完成前面几步的操作后,大致得到了一个创建数据库,添加表格,以及简单的增删改查等功能,然后借助RecyclerView的列表显示把数据库的内容显示出来。接下来对列表项进行一个小小的改动,点击Item进入详情展示的页面,长按Item对列表项进行删除,这里的删除仅仅涉及到列表的删除,并没有对数据库进行删除。要实现对数据库删除就调用之前的数据库工具类进行操作。在详情展示的页面用到的数据是从适配器里面传递过来的,简介的内容用一个JSON文件进行解析,然后显示到一个TextView里面。
一、 为Item添加监听事件
这一步需要在RecyclerView的适配器里面进行,也可以写一个接口,然后提供一个方法给Activity调用,通过复写接口的方法进行事件监听和响应。
我用的方法是在适配器里面直接对Item进行监听,然后重写点击的方法,在适配器代码中进行修改,代码如下:
public void removeItem(int position){
list.remove (position);
notifyItemRemoved (position);
}
@NonNull
@Override
public BookHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from (parent.getContext ()).inflate (R.layout.layout_item,parent,false);
final BookHolder bookHolder = new BookHolder (view);
bookHolder.itemView.setOnClickListener (new View.OnClickListener () {//对Item进行事件监听
@Override
public void onClick(View view) {//点击Item触发事件,跳转到详情页,并传递该View的值
//Toast.makeText (view.getContext (),"点击",Toast.LENGTH_SHORT).show ();
Intent intent = new Intent (new Intent (view.getContext (),DetailsActivity.class));
String imgUrl = list.get (bookHolder.getAdapterPosition ()).getImgUrl ();
Bundle bundle = new Bundle ();
bundle.putString ("image",imgUrl);
bundle.putString ("name",(String) bookHolder.tvBookName.getText ());
bundle.putString ("author",(String)bookHolder.tvBookAuthor.getText ());
intent.putExtras (bundle);
view.getContext ().startActivity (intent);
}
});
bookHolder.itemView.setOnLongClickListener (new View.OnLongClickListener () {
@Override
public boolean onLongClick(View view) {//长按触发移除事件
removeItem (bookHolder.getAdapterPosition ());
Toast.makeText (view.getContext (),"长按删除",Toast.LENGTH_SHORT).show ();
return false;
}
});
return bookHolder;
}
新建一个Activity或者Fragment用于显示详情页,详情页分为两个部分,头部分显示图片,作者,书名,用的是从适配器获得的数据,下部分详情显示用的是Json数据里面的数据;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_details);
initView ();
Bundle bundle = getIntent ().getExtras ();
DetailImage = bundle.getString ("image");
DetailName = bundle.getString ("name");
DetailAuthor = bundle.getString ("author");
Glide.with (this).load (DetailImage).into (ivDetailImage);
getBook ();
setInfo (books);
tvDetailName.setText (DetailName);
tvDetailAuthor.setText (DetailAuthor);
}
二、 对JSON数据进行解析和显示
1. 新建一个本地文本来保存JSON数据
首先进一个资源文件夹assets
JSON数据内容
[
{
"name": "《红楼梦》",
"info": "《红楼梦》,中国古代章回体长篇小说,又名《石头记》《金玉缘》,被列为中国古典四大名著之首,一般认为是清代作家曹雪芹 所著。小说以贾、史、王、薛四大家族的兴衰为背景,以富贵公子贾宝玉为视角,描绘了一批举止见识出于须眉之上的闺阁佳人们的人生百态,展现了正邪两赋有情人的人性美和悲剧美,可以说是一部从各个角度展现女性美的史诗。"
},
{
"name": "《西游记》",
"info": "《西游记》是中国古代第一部浪漫主义章回体长篇神魔小说。现存明刊百回本《西游记》均无作者署名。清代学者吴玉搢等首先提出《西游记》作者是明代吴承恩。这部小说以“唐僧取经”这一历史事件为蓝本,通过作者的艺术加工,深刻地描绘了当时的社会现实。全书主要描写了孙悟空出世及大闹天宫后,遇见了唐僧、猪八戒和沙僧三人,西行取经,一路降妖伏魔,经历了九九八十一难,终于到达西天见到如来佛祖,最终五圣成真的故事。"
},
{
"name": "《三国演义》",
"info": "《三国演义》是中国古典四大名著之一,是中国第一部长篇章回体历史演义小说,全名为《三国志通俗演义》(又称《三国志演义》),作者是元末明初的著名小说家罗贯中。《三国志通俗演义》成书后有嘉靖壬午本等多个版本传于世,到了明末清初,毛宗岗对《三国演义》整顿回目、修正文辞、改换诗文。"
},
{
"name": "《水浒传》",
"info": "《水浒传》,中国四大名著之一,是一部以北宋末年宋江起义为主要故事背景、类型上属于英雄传奇的章回体长篇小说。全书通过描写梁山好汉反抗欺压、水泊梁山壮大和受宋朝招安,以及受招安后为宋朝征战,最终消亡的宏大故事,艺术地反映了中国历史上宋江起义从发生、发展直至失败的全过程,深刻揭示了起义的社会根源,满腔热情地歌颂了起义英雄的反抗斗争和他们的社会理想,也具体揭示了起义失败的内在历史原因。 "
}
]
2. 新建一个Book类用来保存json数据
public class Book {
private String name;
private String info;
public Book(String name, String info) {
this.name = name;
this.info = info;
}
//Getter and Setter
在详情Activity添加解析JSON用到的方法
public void getBook(){
String result = getJson ("book.txt");
try {
JSONArray json = new JSONArray(result);
for(int i=0;i list){
if(list != null){
for (int i =0;i