功能实现

  • 一、登陆界面使用SharedPreferences存储账号密码数据
  • 二、日记栏列表界面实现搜索功能(用到Room)
  • 三、日记栏界面实现添加日记功能(用到Room)
  • 四、日记栏界面长按item实现删除和修改功能(用到Room)

运行结果

我的代码:

布局:

登陆界面:activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><ImageViewandroid:id="@+id/photo"android:layout_width="165dp"android:layout_height="177dp"android:layout_marginStart="16dp"android:layout_marginTop="32dp"android:layout_marginEnd="16dp"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:srcCompat="@drawable/login2" /><TextViewandroid:id="@+id/textView1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="24dp"android:layout_marginTop="50dp"android:text="用户名"android:textSize="24sp"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/photo" /><EditTextandroid:id="@+id/user"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="12dp"android:ems="10"android:hint="由字母或数字组成"android:inputType="text"android:maxLength="11"android:textSize="24sp"app:layout_constraintBaseline_toBaselineOf="@+id/textView1"app:layout_constraintStart_toEndOf="@+id/textView1" /><TextViewandroid:id="@+id/textView2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="24dp"android:layout_marginTop="25dp"android:text="密 码"android:textSize="24sp"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/textView1" /><EditTextandroid:id="@+id/password"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="30dp"android:ems="10"android:hint="不超过10个字符"android:inputType="textPassword"android:maxLength="10"android:textSize="24sp"app:layout_constraintBaseline_toBaselineOf="@+id/textView2"app:layout_constraintStart_toEndOf="@+id/textView2" /><CheckBoxandroid:id="@+id/remember"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="24dp"android:layout_marginTop="32dp"android:text="记住我"android:textSize="20sp"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/textView2" /><Buttonandroid:id="@+id/login"android:layout_width="379dp"android:layout_height="66dp"android:layout_marginStart="8dp"android:layout_marginEnd="8dp"android:layout_marginBottom="36dp"android:backgroundTint="@android:color/holo_green_light"android:text="登录"android:textSize="20sp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

日记栏recyclerview界面:activity_diary_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#2FC19F9F"tools:context=".DiaryMain"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recyclerview"android:layout_width="match_parent"android:layout_height="match_parent"android:scaleX="0.9"tools:layout_editor_absoluteX="1dp"tools:layout_editor_absoluteY="1dp" /><ImageButtonandroid:id="@+id/btn_add"android:layout_width="78dp"android:layout_height="78dp"android:layout_marginEnd="4dp"android:layout_marginBottom="68dp"android:background="#00000000"android:scaleType="fitXY"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:srcCompat="@android:drawable/ic_input_add" /></androidx.constraintlayout.widget.ConstraintLayout>

日记编辑界面:activity_edit_diary.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/RatativeLayout"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".EditDiary"><TextViewandroid:id="@+id/tv_edit_time"android:layout_width="66dp"android:layout_height="29dp"android:layout_marginStart="32dp"android:layout_marginTop="52dp"android:gravity="center"android:text="日期"android:textSize="20sp"android:textStyle="bold"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /><TextViewandroid:id="@+id/tv_edit_title"android:layout_width="66dp"android:layout_height="29dp"android:layout_marginStart="32dp"android:layout_marginTop="132dp"android:gravity="center"android:text="标题"android:textSize="20sp"android:textStyle="bold"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /><EditTextandroid:id="@+id/et_edit_title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="40dp"android:ems="10"android:inputType="textPersonName"app:layout_constraintBaseline_toBaselineOf="@+id/tv_edit_title"app:layout_constraintStart_toEndOf="@+id/tv_edit_title" /><TextViewandroid:id="@+id/tv_edit_content"android:layout_width="66dp"android:layout_height="29dp"android:layout_marginStart="32dp"android:layout_marginTop="212dp"android:gravity="center"android:text="内容"android:textSize="20sp"android:textStyle="bold"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /><EditTextandroid:id="@+id/et_edit_content"android:layout_width="334dp"android:layout_height="337dp"android:layout_marginStart="48dp"android:layout_marginBottom="68dp"android:background="@android:drawable/edit_text"android:enabled="true"android:gravity="top"android:inputType="textMultiLine"android:maxLines="10"android:scrollbars="vertical"android:textSize="20sp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintStart_toStartOf="parent" /><TextViewandroid:id="@+id/tv_edit_date"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="40dp"android:layout_marginTop="52dp"android:text="TextView"android:textSize="20sp"app:layout_constraintStart_toEndOf="@+id/tv_edit_time"app:layout_constraintTop_toTopOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout>

日记编辑界面的actionbar:myactionbar.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@android:color/holo_green_light">android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center_vertical"android:paddingLeft="10dp"android:paddingRight="10dp" ><TextViewandroid:id="@+id/title"android:layout_width="150dp"android:layout_height="wrap_content"android:layout_centerInParent="true"android:text="Edit   Diary"android:textColor="#FFFFFFFF"android:textSize="30sp"android:textStyle="bold" /><ImageViewandroid:id="@+id/iv_return"android:layout_width="75dp"android:layout_height="65dp"android:layout_alignBottom="@+id/iv_confirm"android:layout_marginStart="0dp"android:layout_marginEnd="55dp"android:layout_marginBottom="7dp"android:layout_toStartOf="@+id/title"android:gravity="center"app:srcCompat="?attr/homeAsUpIndicator" /><ImageViewandroid:id="@+id/iv_confirm"android:layout_width="112dp"android:layout_height="75dp"android:layout_alignBottom="@+id/title"android:layout_alignParentEnd="true"android:layout_marginStart="36dp"android:layout_marginEnd="-18dp"android:layout_marginBottom="-14dp"android:layout_toEndOf="@+id/title"android:gravity="center"app:srcCompat="?android:attr/textCheckMarkInverse" /></RelativeLayout>

recyclerview的item布局:recyclerview_row_item.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="10dp"app:cardCornerRadius="10dp"app:cardElevation="1dp"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><TextViewandroid:id="@+id/tv_id"android:layout_width="wrap_content"android:layout_height="150dp"android:layout_marginLeft="35dp"android:layout_weight="1"android:gravity="center|top"android:paddingTop="8dp"android:text="1"android:textSize="40sp" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="25"android:orientation="vertical"><TextViewandroid:id="@+id/tv_title"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="2"android:gravity="center|left"android:paddingLeft="100dp"android:paddingTop="10dp"android:text="TextView"android:textSize="34sp"android:textStyle="italic" /><TextViewandroid:id="@+id/tv_date"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:elevation="2dp"android:gravity="center|top|left"android:paddingLeft="100dp"android:paddingTop="20dp"android:text="TextView"android:textSize="20sp" /></LinearLayout></LinearLayout>
</androidx.cardview.widget.CardView>

长按item的上下文菜单:diary_context_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:android="http://schemas.android.com/apk/res/android"><itemandroid:id="@+id/menu_delete"android:title="删除" /><itemandroid:id="@+id/menu_update"android:title="修改" />
</menu>

recyclerview主界面的菜单布局:diary_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:android="http://schemas.android.com/apk/res/android"><itemandroid:id="@+id/item_search"android:icon="@android:drawable/ic_menu_search"android:title="搜索"app:actionViewClass="android.widget.SearchView"app:showAsAction="always" />
</menu>

代码实现:

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() {@Overridepublic 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","数据读取成功");}}@Overrideprotected 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<Diary> 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() {@Overridepublic 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();}}@Overrideprotected 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();}@Overridepublic 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() {@Overridepublic boolean onQueryTextSubmit(String s) {list=diaryDao.getRequiredDiary(s);adapter.setList(list);return false;}@Overridepublic boolean onQueryTextChange(String s) {list=diaryDao.getRequiredDiary(s);adapter.setList(list);return false;}});return super.onCreateOptionsMenu(menu);}@Overridepublic 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);}@Overridepublic void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {super.onCreateContextMenu(menu, v, menuInfo);getMenuInflater().inflate(R.menu.diary_context_menu,menu);}@Overridepublic 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() {@Overridepublic 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() {@Overridepublic 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);}@Overrideprotected 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<Diary> 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());}}//自定义actionbarprivate 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<CustomAdapter.ViewHolder>{private int position;private List<Diary> list;int count=0;public CustomAdapter(List<Diary> list) {this.list = list;}public int getPosition() {return position;}public void setPosition(int position) {this.position = position;}//用于获得删选过后的recyclerview的数据集public void setList(List<Diary> list){count=0;//计数需要清零this.list=list;notifyDataSetChanged();}@NonNull@Overridepublic 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() {@Overridepublic boolean onLongClick(View view) {setPosition(viewHolder.getAdapterPosition());return false;}});return viewHolder;}@Overridepublic 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));}@Overridepublic 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<Diary> getAll();@Query("SELECT * FROM Diaries WHERE id=:id")Diary findDiary(int id);@Query("SELECT * FROM Diaries WHERE title LIKE '%'||:searchName||'%'")List<Diary> getRequiredDiary(String searchName);@Insertvoid insert(Diary diary);@Deletevoid delete(Diary diary);@Updatevoid 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();
}

作者也是安卓初学者,请多指教。

安卓开发日记APP史上最详细(SharedPreferences+Room)相关推荐

  1. 安卓开发论坛!史上最通俗计算机网络分层详解,BAT大厂面试总结

    开头 经常会有人问:"现在学习Android开发还有前景?"我的看法是现在只是市场趋于平稳了,对开发人员的要求越来越好了,这并不代表没有前景了. 移动开发不等于App开发,所有新的 ...

  2. 手把手教你从头开始搭建友善之臂ARM-tiny4412开发环境(史上最详细!!)

    创建一个ARM目录 mkdir   /disk/A9  -p 接下来你需要准备以下的东西 1.arm-linux-gcc-4.5.1     交叉编译器 2.linux-3.5-tiny4412    ...

  3. 友善之臂编linux内核,手把手教你从头开始搭建友善之臂ARM-tiny4412开发环境(史上最详细!!)...

    在命令行中输入: minicom -s ┌─────[configuration]──────┐ │ Filenames and paths │ File transferprotocols │ Se ...

  4. ESP8266 Non-OS SDK 开发之旅 基础篇① 初识 Non-OS SDK,史上超级详细手把手教小白20分钟快速搭建SDK软件开发环境,完成第一个例子Hello World!

    文章目录 1.前言 2. SDK概述 2.1 SDK使用流程 2.2 ESP8266 HDK -- 硬件开发工具 2.3 ESP8266 SDK -- 软件开发工具包 2.3.1 Non-OS SDK ...

  5. GitChat·大数据 | 史上最详细的Hadoop环境搭建

    GitChat 作者:鸣宇淳 原文: 史上最详细的Hadoop环境搭建 关注公众号:GitChat 技术杂谈,一本正经的讲技术 [不要错过文末彩蛋] 前言 Hadoop在大数据技术体系中的地位至关重要 ...

  6. Kafka史上最详细原理总结(一)

    Kafka史上最详细原理总结 一.概念理解 (1)产生背景 (2)Kafka的特性 (3)Kafka场景应用 (4)Kafka一些重要设计思想 二.消息队列通信的模式 (1)点对点模式 (2)发布订阅 ...

  7. 史上最详细的微生物扩增子数据库整理

    声明:文件所有链接内容来自"生信控"公众号,已经获作者向屿授权. 本人对每个数据库的使用目的和经验配导读,需要使用的小伙伴读点击链接跳转原文学习. "生信控"相 ...

  8. 自学软件测试怎么学?【史上最详细学习路线】(附全套资料)

    对于想入行学软件测试的新手来说,首先需要一个高效的学习线路图,还要有全套的学习资料,两者结合才能有最好的学习效果. 授人以鱼不如授人以渔,所以今天我也想把我的经验和经历分享给大家,史上最详细的软件测试 ...

  9. 史上最详细的LXR安装介绍

    史上最详细的LXR安装介绍(Ubuntu14.04+Apache2.4.7) 简介: LXR (Linux Cross Reference)是一个通过交叉索引方便用户查看项目源代码的工具.项目地址:h ...

  10. IM开发宝典:史上最全,微信各种功能参数和逻辑规则资料汇总

    1.引言 IM应用的初学者们,在补全了各种基础技术知识后(如果您仍不具备这些知识,建议马上阅读<新手入门一篇就够:从零开发移动端IM>),在动手编码实践时,很多时候纠结的并不是功能该如何实 ...

最新文章

  1. 2020 AI产业图谱启动,勾勒中国AI技术与行业生态
  2. Codeforces.809E.Surprise me!(莫比乌斯反演 虚树)
  3. 实战SSM_O2O商铺_14【商铺注册】View层之验证码kaptcha组件
  4. 7zip File: How to Uncompress 7z files on Ubuntu, Debian, Fedora
  5. 卡巴斯基将支持微软企业安全解决方案Forefront
  6. 小程序开发代码_企业为什么要选择小程序定制开发?
  7. Bootstrap table列内容过长,显示固定长度,超过内容隐藏
  8. 得到选择框句柄 怎么操作_怎么选择小前锋才能在NBA2kol2中使自己的阵容得到提升...
  9. 一个人的旅行 图论最短路问题
  10. Linux Redis集群搭建与集群客户端实现
  11. cakephp index.php,CakePHP - 中文手册
  12. JavaScript实用手册
  13. Food Webs - 网络中度及集聚系数实现
  14. 【魔方代码】1200行C语言代码实现“魔方”程序,学会它买魔方的钱都省了,拿走不谢~
  15. 计算机专业中怎么样绘制神经网络结构图
  16. Win7环境下STAF安装STAX遇到的问题及解决方法
  17. 【rose】rose框架学习总结
  18. 悠悠古舟渡,浅浅时光去
  19. 【转】ESL和ESR的基本認識
  20. 【算法】在N个乱序数字中查找第K大的数字

热门文章

  1. IE无法打开internet站点已终止操作的解决办法
  2. Oracle 分页方法研究
  3. 【附源码】计算机毕业设计SSM小说阅读网站
  4. 计算机组成原理基础知识点
  5. 使用Python开发游戏运行脚本(一)成功调用大漠插件
  6. 文献综述是什么,该怎么写?
  7. Python包pretty_errors
  8. php违章查询源码,ThinkPHP聚合数据违章查询接口
  9. 纯HTML+CSS实现3D炫酷魔方(相册)
  10. css最后一行省略号,CSS怎么实现单行、多行文本溢出显示省略号