2024年安卓最全Android 垃圾分类APP(七)历史记录(2),我的头条面试经历分享怎么说

最后

这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

相信它会给大家带来很多收获:

img

当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。

  • 无论你现在水平怎么样一定要 持续学习 没有鸡汤,别人看起来的毫不费力,其实费了很大力,这四个字就是我的建议!!!
  • 我希望每一个努力生活的IT工程师,都会得到自己想要的,因为我们很辛苦,我们应得的。

当我们在抱怨环境,抱怨怀才不遇的时候,没有别的原因,一定是你做的还不够好!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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);

}

/**

  • 根据所有历史记录

*/

public static void deleteAllHistory() {

LitePal.deleteAll(History.class);

}

下面我要修改一下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.chad.library.adapter.base.BaseQuickAdapter;

import com.llw.goodtrash.R;

import com.llw.goodtrash.adapter.HistoryAdapter;

import com.llw.goodtrash.model.History;

import com.llw.goodtrash.utils.HistoryHelper;

import com.llw.mvplibrary.base.BaseActivity;

import org.litepal.LitePal;

import java.util.ArrayList;

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 = new ArrayList<>();

@Override

public void initData(Bundle savedInstanceState) {

initView();

showListData();

}

/**

  • 页面初始化

*/

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);

mAdapter = new HistoryAdapter(R.layout.item_history_rv, mList);

rvHistory.setLayoutManager(new LinearLayoutManager(context));

rvHistory.setAdapter(mAdapter);

//列表item点击事件

mAdapter.setOnItemChildClickListener((adapter, view, position) -> {

});

}

/**

  • 显示列表

*/

private void showListData() {

List historyList = HistoryHelper.queryAllHistory();

if (historyList.size() > 0) {

//设置列表的数据

mList.clear();

mList.addAll(historyList);

mAdapter.notifyDataSetChanged();

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_history.xml,在toolbar控件中,增加一个全删,如下所示:

<TextView

android:id=“@+id/tv_all_delete”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:layout_gravity=“right”

android:onClick=“deleteAll”

android:textColor=“@color/black”

android:textSize=“@dimen/sp_16”

android:layout_marginEnd=“@dimen/dp_4”

android:text=“全删”

android:padding=“@dimen/dp_12”/>

在这里插入图片描述

回到HistoryActivity中。

//全删

private TextView tvAllDelete;

绑定控件id。

在这里插入图片描述

控制是否显示这个按钮。

在这里插入图片描述

点击全删的实现代码。

/**

  • 全删

  • @param view

*/

public void deleteAll(View view) {

总结

最后小编想说:不论以后选择什么方向发展,目前重要的是把Android方面的技术学好,毕竟其实对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

这里附上我整理的几十套腾讯、字节跳动,京东,小米,头条、阿里、美团等公司19年的Android面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

技术进阶之路很漫长,一起共勉吧~

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4NDM2MjE0,size_16,color_FFFFFF,t_70)

控制是否显示这个按钮。

在这里插入图片描述

点击全删的实现代码。

/**

  • 全删

  • @param view

*/

public void deleteAll(View view) {

总结

最后小编想说:不论以后选择什么方向发展,目前重要的是把Android方面的技术学好,毕竟其实对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

这里附上我整理的几十套腾讯、字节跳动,京东,小米,头条、阿里、美团等公司19年的Android面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。

[外链图片转存中…(img-aC99muvc-1715793156018)]

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

技术进阶之路很漫长,一起共勉吧~

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值