import com.llw.goodtrash.R;
import com.llw.goodtrash.model.History;
import java.util.List;
/**
-
历史记录列表适配器
-
@author llw
*/
public class HistoryAdapter extends BaseQuickAdapter<History, BaseViewHolder> {
public HistoryAdapter(int layoutResId, @Nullable List data) {
super(layoutResId, data);
}
@Override
protected void convert(BaseViewHolder helper, History item) {
helper.setText(R.id.tv_name, item.getName())
.setText(R.id.tv_datetime,item.getDateTime())
.setText(R.id.tv_explain, item.getExplain());
TextView tvType = helper.getView(R.id.tv_type);
switch (item.getType()) {
case 0:
tvType.setText(“可回收垃圾”);
break;
case 1:
tvType.setText(“有害垃圾”);
break;
case 2:
tvType.setText(“厨余垃圾”);
break;
case 3:
//干垃圾即其他垃圾
tvType.setText(“干垃圾”);
break;
default:
tvType.setText(“可回收垃圾”);
break;
}
}
}
修改HistoryActivity页面代码如下:
package com.llw.goodtrash.ui;
import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import android.view.View;
import android.widget.LinearLayout;
import com.llw.goodtrash.R;
import com.llw.goodtrash.adapter.HistoryAdapter;
import com.llw.goodtrash.model.History;
import com.llw.mvplibrary.base.BaseActivity;
import org.litepal.LitePal;
import java.util.List;
/**
-
历史记录
-
@author llw
*/
public class HistoryActivity extends BaseActivity {
//工具栏
private Toolbar toolbar;
//空数据布局
private LinearLayout layEmptyData;
//历史列表
private RecyclerView rvHistory;
//适配器
private HistoryAdapter mAdapter;
//历史数据列表
private List mList;
@Override
public void initData(Bundle savedInstanceState) {
initView();
}
/**
- 页面初始化
*/
private void initView() {
toolbar = findViewById(R.id.toolbar);
//设置页面状态栏
setStatubar(this, R.color.white, true);
back(toolbar,false);
layEmptyData = findViewById(R.id.lay_empty_data);
rvHistory = findViewById(R.id.rv_history);
//获取数据库中的历史数据
mList = LitePal.findAll(History.class);
if (mList.size() > 0) {
//设置列表的数据
mAdapter = new HistoryAdapter(R.layout.item_history_rv, mList);
rvHistory.setLayoutManager(new LinearLayoutManager(context));
rvHistory.setAdapter(mAdapter);
layEmptyData.setVisibility(View.GONE);
rvHistory.setVisibility(View.VISIBLE);
} else {
//隐藏列表
layEmptyData.setVisibility(View.VISIBLE);
rvHistory.setVisibility(View.GONE);
}
}
@Override
public int getLayoutId() {
return R.layout.activity_history;
}
}
下面我们增加一个进入历史记录页面的入口。
修改activity_main.xml。在NestedScrollView下面加上一个浮动按钮:
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id=“@+id/btn_history”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:layout_gravity=“bottom|end”
android:layout_margin=“@dimen/dp_20”
android:src=“@mipmap/icon_history”
android:onClick=“jumpHistory”
app:backgroundTint=“@color/white”
app:backgroundTintMode=“screen”
app:fabSize=“mini”
app:hoveredFocusedTranslationZ=“@dimen/dp_18”
app:pressedTranslationZ=“@dimen/dp_18” />
位置如下图所示:
icon_history图标
然后在MainActivity中写一个jumpHistory方法,代码如下:
/**
- 进入历史记录页面
*/
public void jumpHistory(View view) {
gotoActivity(HistoryActivity.class);
}
运行一下;
嗯,现在是空空如也,下面来添加记录,进行垃圾分类结果返回的第三有三个,分别是文字输入进行垃圾分类,语音输入进行垃圾分类,还有图像输入进行垃圾分类。下面先来看看怎么保存这个垃圾分类的信息。
在前面的文章中当进行分类时,会关联出很多物品,而我们要保存和我输入物品的一致性才行,比如当我搜索水杯时,会出现的结果有:水杯、保温杯、汽车杯等一些物品。而我只需要保存水杯的结果到历史记录就可以了。那么在写保存方法时首先要比对这个搜索结果。一致才保存。
下面来写代码,这里我还是写一个帮助类。在utils下新建一个HistoryHelper类,里面的代码如下:
package com.llw.goodtrash.utils;
import android.util.Log;
import com.google.gson.Gson;
import com.llw.goodtrash.model.History;
import com.llw.goodtrash.model.TrashResponse;
import com.llw.mvplibrary.network.utils.DateUtil;
import org.litepal.LitePal;
import java.util.List;
/**
-
历史记录帮助类
-
@author llw
*/
public class HistoryHelper {
public static final String TAG = “HistoryHelper”;
/**
-
查询所有历史记录
-
@return 结果列表
*/
public static List queryAllHistory() {
return LitePal.findAll(History.class);
}
/**
-
是否存在历史记录
-
@param name 物品名
-
@return true or false
*/
public static boolean isHaveHistory(String name) {
List histories = LitePal.where(“name = ?”, name).find(History.class);
return histories.size() > 0;
}
/**
-
保存历史记录
-
@param list 需要保存的数据
-
@param word 物品名称
*/
public static void saveHistory(List<TrashResponse.NewslistBean> list, String word) {
for (TrashResponse.NewslistBean bean : list) {
//遍历返回数据,找出返回结果中与搜索内容一致的数据,保存到数据表中
if (bean.getName().equals(word)) {
//保存数据前先查询是否存在数据
List historyList = queryAllHistory();
//有数据则遍历检查保存
if (historyList.size() > 0) {
if (!isHaveHistory(bean.getName())) {
//不存在则直接保存
saveHistory(bean);
} else {
Log.d(TAG, “记录已存在”);
}
} else {
//没有数据则直接保存
saveHistory(bean);
}
} else {
Log.d(TAG, “没有匹配到相关结果,无法保存”);
}
}
Log.d(TAG,new Gson().toJson(queryAllHistory()));
}
/**
-
保存历史
-
@param bean
*/
private static void saveHistory(TrashResponse.NewslistBean bean) {
History historyBean = new History();
historyBean.setName(bean.getName());
historyBean.setType(bean.getType());
historyBean.setAipre(bean.getAipre());
historyBean.setExplain(bean.getExplain());
historyBean.setContain(bean.getContain());
historyBean.setTip(bean.getTip());
//添加历史记录的保存时间
historyBean.setDateTime(DateUtil.getDateTime());
historyBean.save();
if (historyBean.save()) {
Log.d(TAG, “保存历史记录成功”);
} else {
Log.d(TAG, “保存历史记录失败”);
}
}
}
下面去使用一下这个方法。
首先是文字输入页面TextInputActivity。
将之前的word变成成员变量:
private String word;//输入的物品
当点击软键盘的搜索按钮时会将输入框的内容赋值给word。
然后只要在getSearchResponse方法中保存就好了。
下面进入声音输入页面VoiceInputActivity。
private String word;//输入的物品
进行赋值
保存结果。
然后是图像输入页面ImageInputActivity。
private String word;//输入的物品
然后赋值:
最后保存。
下面基本上都有了保存,运行一下:
嗯,效果还是不错的吧。
既然有保存,那就应该有删除,理论上来说,删除也是有学问的,单项删除、多选删除、全删。而删除的方法也是多种多样的,比如点击弹窗删除,侧滑删除,编辑列表删除。各种各样的,这里我就弄一个滑动删除和全选删除吧。
先来看看侧滑删除,这里需要用到一个第三方依赖库,打开mvplibrary下的build.gradle。
在dependencies{}闭包下添加如下依赖:
//列表item侧滑删除
api ‘com.github.mcxtzhang:SwipeDelMenuLayout:V1.3.0’
添加位置如下:
下面修改历史列表的item布局。
<?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=“wrap_content”
android:layout_marginBottom=“@dimen/dp_1”
android:background=“@color/white”>
<com.mcxtzhang.swipemenulib.SwipeMenuLayout
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:clickable=“true”
android:paddingBottom=“1dp”>
<RelativeLayout
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:padding=“@dimen/dp_12”>
<TextView
android:id=“@+id/tv_name”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:text=“物品名称”
android:textColor=“@color/black”
android:textSize=“@dimen/sp_16” />
<TextView
android:id=“@+id/tv_datetime”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:layout_alignParentEnd=“true”
android:text=“保存时间”
android:textColor=“@color/black”
android:textSize=“@dimen/sp_14” />
<TextView
android:id=“@+id/tv_type”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:layout_below=“@+id/tv_name”
android:layout_marginTop=“@dimen/dp_8”
android:text=“垃圾类型”
android:textColor=“@color/hint_color”
android:textSize=“@dimen/sp_14” />
<TextView
android:id=“@+id/tv_explain”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:layout_below=“@+id/tv_type”
android:layout_marginTop=“@dimen/dp_8”
android:text=“解释”
android:textColor=“@color/hint_color”
android:textSize=“@dimen/sp_14” />
<Button
android:id=“@+id/btn_delete”
android:layout_width=“@dimen/dp_100”
android:layout_height=“match_parent”
android:background=“@color/red”
android:text=“删除”
android:textColor=“@color/white” />
</com.mcxtzhang.swipemenulib.SwipeMenuLayout>
这里有一个red的颜色,在app模块的colors.xml中添加
#FF0000
然后修改适配器HistoryAdapter,添加侧滑菜单的点击事件。
然后回到HistoryActivity页面去设置适配器的点击事件。
//列表item点击事件
mAdapter.setOnItemChildClickListener((adapter, view, position) -> {
});
添加位置如下图所示:
由于现在只给适配器中的一个控件设置了点击事件,因此可以直接写代码,而不需要去判断控件id了。
那么下面在HistoryHelper中添加如下两个删除方法:
/**
-
根据id删除数据
-
@param id id
*/
public static void deleteHistoryById(long id){
LitePal.delete(History.class,id);
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
总结
其实客户端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
然而Android架构学习进阶是一条漫长而艰苦的道路,不能靠一时激情,更不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
XNR-1712605511141)]
[外链图片转存中…(img-h8Y5J3jn-1712605511141)]
[外链图片转存中…(img-4zYBhzQn-1712605511141)]
[外链图片转存中…(img-MDBeb7L0-1712605511141)]
[外链图片转存中…(img-4b3FgY7l-1712605511142)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-H35ynErq-1712605511142)]
总结
其实客户端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
[外链图片转存中…(img-SU0miS2r-1712605511143)]
[外链图片转存中…(img-8F2XAuyX-1712605511143)]
然而Android架构学习进阶是一条漫长而艰苦的道路,不能靠一时激情,更不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-ZCKIkuUq-1712605511143)]