功能实现
- 一、登陆界面使用SharedPreferences存储账号密码数据
- 二、日记栏列表界面实现搜索功能(用到Room)
- 三、日记栏界面实现添加日记功能(用到Room)
- 四、日记栏界面长按item实现删除和修改功能(用到Room)
我的代码:
布局:
登陆界面:activity_main.xml
日记栏recyclerview界面:activity_diary_main.xml
日记编辑界面:activity_edit_diary.xml
日记编辑界面的actionbar:myactionbar.xml
android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_vertical" android:paddingLeft="10dp" android:paddingRight="10dp" >
recyclerview的item布局:recyclerview_row_item.xml
长按item的上下文菜单:diary_context_menu.xml
recyclerview主界面的菜单布局:diary_menu.xml
代码实现:
MainActivity:
package com.example.diaryapplication;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity {
private EditText et_user;
private EditText et_password;
private CheckBox cb_remember;
private Button bt_login;
private View.OnClickListener listener1=new View.OnClickListener() {
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.login:
login();
break;
}
}
};
public void init(){
et_user=(EditText) findViewById(R.id.user);
et_password=(EditText) findViewById(R.id.password);
cb_remember=(CheckBox) findViewById(R.id.remember);
bt_login=(Button) findViewById(R.id.login);
bt_login.setOnClickListener(listener1);
}
public void login(){
if(cb_remember.isChecked()){
rememberme();
}else{
unrememberme();
}
Intent intent=new Intent(MainActivity.this,DiaryMain.class);
intent.putExtra("isUpdate","nocreate");
startActivity(intent);
}
private void unrememberme() {
SharedPreferences sp=getSharedPreferences("mydata",Context.MODE_PRIVATE);
SharedPreferences.Editor editor=sp.edit();
editor.clear();
editor.apply();
Log.d("flag","数据已删除");
}
private void rememberme() {
String username=et_user.getText().toString();
String password=et_password.getText().toString();
SharedPreferences sp=getSharedPreferences("mydata", Context.MODE_PRIVATE);
SharedPreferences.Editor editor=sp.edit();
editor.putBoolean("remember",true);
editor.putString("username",username);
editor.putString("password",password);
editor.apply();
Log.d("flag","数据保存成功");
}
public void readSP(){
SharedPreferences sp=getSharedPreferences("mydata",Context.MODE_PRIVATE);
Boolean remember=sp.getBoolean("remember",false);
if(remember){
cb_remember.setChecked(true);
String username=sp.getString("username","");
String password=sp.getString("password","");
et_user.setText(username);
et_password.setText(password);
Log.d("flag","数据读取成功");
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//设置为全屏模式
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
init();
readSP();
}
}
DiaryMain:
package com.example.diaryapplication;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.room.Database;
import androidx.room.Room;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.SearchView;
import com.example.diaryapplication.adapter.CustomAdapter;
import com.example.diaryapplication.dao.DiaryDao;
import com.example.diaryapplication.db.AppDatabase;
import com.example.diaryapplication.entity.Diary;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.TimeZone;
public class DiaryMain extends AppCompatActivity {
private List list=new ArrayList<>();
private ImageButton btn_add;
private RecyclerView recyclerView;
private CustomAdapter adapter;
private int id_count=0;
private AppDatabase db;
private DiaryDao diaryDao;
View.OnClickListener listener=new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent(DiaryMain.this,EditDiary.class);
intent.setAction("create");
startActivity(intent);
}
};
public void initDatabase(){
db= Room.databaseBuilder(getApplicationContext(), AppDatabase.class,"mydb")
.allowMainThreadQueries()
.build();
diaryDao=db.diaryDao();
}
public void init(){
btn_add=(ImageButton) findViewById(R.id.btn_add);
recyclerView=(RecyclerView) findViewById(R.id.recyclerview);
btn_add.setOnClickListener(listener);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
adapter = new CustomAdapter(list);
recyclerView.setAdapter(adapter);
registerForContextMenu(recyclerView);
}
public void updateList(){
if(getIntent()!=null){
list=diaryDao.getAll();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_diary_main);
//让键盘弹出来是,内容不整体上移
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN| WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
//设置为全屏模式
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
//ActionBar显示返回按钮
ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
initDatabase();
updateList();
init();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.diary_menu,menu);
MenuItem searchItem=menu.findItem(R.id.item_search);
SearchView searchView=(SearchView) searchItem.getActionView();
searchView.setQueryHint("搜索");
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String s) {
list=diaryDao.getRequiredDiary(s);
adapter.setList(list);
return false;
}
@Override
public boolean onQueryTextChange(String s) {
list=diaryDao.getRequiredDiary(s);
adapter.setList(list);
return false;
}
});
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch ( item.getItemId() ) {
case android.R.id.home:
Intent intent=new Intent(DiaryMain.this,MainActivity.class);
startActivity(intent);
}
return super.onOptionsItemSelected(item);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
getMenuInflater().inflate(R.menu.diary_context_menu,menu);
}
@Override
public boolean onContextItemSelected(@NonNull MenuItem item) {
int position=adapter.getPosition();
switch (item.getItemId()){
case R.id.menu_delete:
removeItem(position);
break;
case R.id.menu_update:
Intent intent=new Intent(DiaryMain.this,EditDiary.class);
intent.setAction("update");
intent.putExtra("idInDatabase",list.get(position).getId());
startActivity(intent);
break;
}
return true;
}
private void removeItem(int position) {
diaryDao.delete(list.get(position));//数据库相应的也要删除
list.remove(position);
adapter.notifyItemRemoved(position);
// adapter.setList(list);
}
}
EditDiary:
package com.example.diaryapplication;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.room.Room;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.example.diaryapplication.dao.DiaryDao;
import com.example.diaryapplication.db.AppDatabase;
import com.example.diaryapplication.entity.Diary;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.TimeZone;
public class EditDiary extends AppCompatActivity {
private ImageView iv_return;
private ImageView iv_confirm;
private TextView tv_edit_date;
private EditText et_edit_title;
private EditText et_edit_content;
private long currentTimeMillis;//目前的时间
private String title;
private String content;
private AppDatabase db;
private DiaryDao diaryDao;
private boolean flag=false;//记录是否保存
View.OnClickListener listener=new View.OnClickListener() {
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.iv_return:
Intent intent=new Intent(EditDiary.this,DiaryMain.class);
if(getIntent().getAction().equals("create")&&flag==true){//执行创建一个新日记并且进行了保存
intent.putExtra("isUpdate","createnew");
}else{
intent.putExtra("isUpdate","nocreate");
}
startActivity(intent);
break;
case R.id.iv_confirm:
//判断内容是否完善,未完善则弹出提示框
if(et_edit_title.getText().toString().equals("")||et_edit_content.getText().toString().equals("")){
new AlertDialog.Builder( EditDiary.this )
.setIcon( R.drawable.alert )
.setTitle("提示")
.setMessage("标题或内容未填写,请完善!")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
return;
}
})
.show();
return;
}
collectAndSaveInfo();
flag=true;
Toast.makeText(EditDiary.this,"数据已保存",Toast.LENGTH_SHORT).show();
break;
}
}
};
//收集信息并保存到数据库中
public void collectAndSaveInfo(){
title=et_edit_title.getText().toString();
content=et_edit_content.getText().toString();
if(getIntent().getAction().equals("update")){
Intent intent=getIntent();
int id=intent.getIntExtra("idInDatabase",-1);
Diary diary=diaryDao.findDiary(id);
diary.setTitle(title);
diary.setContent(content);
diaryDao.update(diary);
}else if(getIntent().getAction().equals("create")){
Diary diary=new Diary();
diary.setTitle(title);
diary.setDate(String.valueOf(currentTimeMillis));
diary.setContent(content);
diaryDao.insert(diary);
}
}
public void initDatabase(){
db= Room.databaseBuilder(getApplicationContext(),AppDatabase.class,"mydb")
.allowMainThreadQueries()
.build();
diaryDao=db.diaryDao();
}
public void init(){
iv_return=(ImageView) findViewById(R.id.iv_return);
iv_confirm=(ImageView) findViewById(R.id.iv_confirm);
tv_edit_date=(TextView) findViewById(R.id.tv_edit_date);
et_edit_title=(EditText) findViewById(R.id.et_edit_title);
et_edit_content=(EditText) findViewById(R.id.et_edit_content);
iv_return.setOnClickListener(listener);
iv_confirm.setOnClickListener(listener);
if(getIntent().getAction().equals("update")){
Intent intent=getIntent();
int id=intent.getIntExtra("idInDatabase",-1);
if(id!=-1){
Diary diary=diaryDao.findDiary(id);
currentTimeMillis=Long.valueOf(diary.getDate());
tv_edit_date.setText(changeTime(currentTimeMillis));
et_edit_title.setText(diary.getTitle());
et_edit_content.setText(diary.getContent());
}
}else if(getIntent().getAction().equals("create")){
//初始化当前时间
currentTimeMillis=System.currentTimeMillis();
tv_edit_date.setText(changeTime(currentTimeMillis));
}
}
public String changeTime(Long timeMillis){
SimpleDateFormat sdf_8 = new SimpleDateFormat("yyyy-MM-dd HH:mm");
sdf_8.setTimeZone(TimeZone.getTimeZone("GMT+8:00"));
return sdf_8.format(timeMillis);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit_diary);
//让键盘弹出来是,内容不整体上移
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN| WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
//设置为全屏模式
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setCustomActionBar();
initDatabase();
init();
List diarylist=diaryDao.getAll();
for(Diary diary:diarylist){
Log.d("data",String.valueOf(diary.getId()));
Log.d("data",diary.getDate());
Log.d("data",diary.getTitle());
Log.d("data",diary.getContent());
}
}
//自定义actionbar
private void setCustomActionBar() {
ActionBar.LayoutParams lp = new ActionBar.LayoutParams(ActionBar.LayoutParams.MATCH_PARENT, ActionBar.LayoutParams.MATCH_PARENT, Gravity.CENTER);
View mActionBarView = LayoutInflater.from(this).inflate(R.layout.myactionbar, null);
ActionBar actionBar = this.getSupportActionBar();
actionBar.setCustomView(mActionBarView, lp);
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
actionBar.setDisplayShowCustomEnabled(true);
actionBar.setDisplayShowHomeEnabled(false);
actionBar.setDisplayShowTitleEnabled(false);
}
}
实体类:Diary
package com.example.diaryapplication.entity;
import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.PrimaryKey;
@Entity(tableName = "Diaries")
public class Diary {
@PrimaryKey(autoGenerate = true)
private int id;
@ColumnInfo(name="title")
private String title;
@ColumnInfo(name="date")
private String date;
@ColumnInfo(name="content")
private String content;
public Diary() {
}
public Diary(int id, String title, String date, String content) {
this.id = id;
this.title = title;
this.date = date;
this.content = content;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
适配器adapter:
package com.example.diaryapplication.adapter; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import com.example.diaryapplication.R; import com.example.diaryapplication.entity.Diary; import java.text.SimpleDateFormat; import java.util.List; import java.util.TimeZone; public class CustomAdapter extends RecyclerView.Adapter{ private int position; private List list; int count=0; public CustomAdapter(List list) { this.list = list; } public int getPosition() { return position; } public void setPosition(int position) { this.position = position; } //用于获得删选过后的recyclerview的数据集 public void setList(List list){ count=0;//计数需要清零 this.list=list; notifyDataSetChanged(); } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_row_item, parent, false); ViewHolder viewHolder=new ViewHolder(view); viewHolder.itemView.setLongClickable(true); viewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { setPosition(viewHolder.getAdapterPosition()); return false; } }); return viewHolder; } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { Log.d("myflag","yyy"); Diary diary=list.get(position); holder.tv_id.setText(String.valueOf(++count)); holder.tv_title.setText(diary.getTitle()); //转换时间格式 Long currentTimeMillis = Long.valueOf(diary.getDate()); SimpleDateFormat sdf_8 = new SimpleDateFormat("yyyy-MM-dd HH:mm"); sdf_8.setTimeZone(TimeZone.getTimeZone("GMT+8:00")); holder.tv_date.setText(sdf_8.format(currentTimeMillis)); } @Override public int getItemCount() { return list.size(); } public static class ViewHolder extends RecyclerView.ViewHolder{ TextView tv_id; TextView tv_title; TextView tv_date; public ViewHolder(@NonNull View itemView) { super(itemView); tv_id=(TextView) itemView.findViewById(R.id.tv_id); tv_title=(TextView) itemView.findViewById(R.id.tv_title); tv_date=(TextView) itemView.findViewById(R.id.tv_date); } } }
dao接口:
package com.example.diaryapplication.dao;
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.Query;
import androidx.room.Update;
import com.example.diaryapplication.entity.Diary;
import java.util.List;
@Dao
public interface DiaryDao {
//根据日期降序排序
@Query("SELECT * FROM Diaries ORDER BY CAST(date AS DECIMAL)DESC")
List getAll();
@Query("SELECt * FROM Diaries WHERe id=:id")
Diary findDiary(int id);
@Query("SELECt * FROM Diaries WHERe title LIKE '%'||:searchName||'%'")
List getRequiredDiary(String searchName);
@Insert
void insert(Diary diary);
@Delete
void delete(Diary diary);
@Update
void update(Diary diary);
}
AppDatabase:
package com.example.diaryapplication.db;
import androidx.room.Database;
import androidx.room.RoomDatabase;
import com.example.diaryapplication.dao.DiaryDao;
import com.example.diaryapplication.entity.Diary;
@Database(entities = {Diary.class},version = 1)
public abstract class AppDatabase extends RoomDatabase{
public abstract DiaryDao diaryDao();
}
作者也是安卓初学者,请多指教。



