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

 

 

功能实现

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

运行结果

a037be04628048e6a29b1ce3c9c87096.png4557ba64336845cfbda3d04398980c22.png

 

1526208131314515bcba0d81101ef406.png

 

我的代码: 

3cba0c5494f14b849585852cdd889835.png

 

 

 布局:

登陆界面: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">

    <ImageView
        android: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" />

    <TextView
        android: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" />

    <EditText
        android: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" />
    <TextView
        android: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" />

    <EditText
        android: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" />

    <CheckBox
        android: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" />
    <Button
        android: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.RecyclerView
        android: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" />

    <ImageButton
        android: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">

    <TextView
        android: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" />

    <TextView
        android: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" />

    <EditText
        android: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" />

    <TextView
        android: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" />

    <EditText
        android: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" />

    <TextView
        android: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" >


    <TextView
        android: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" />

    <ImageView
        android: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" />

    <ImageView
        android: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">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <TextView
            android: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" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="25"
            android:orientation="vertical">

            <TextView
                android: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" />

            <TextView
                android: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">

    <item
        android:id="@+id/menu_delete"
        android:title="删除" />
    <item
        android: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">

    <item
        android: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() {
        @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<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() {
        @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<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());
        }

    }

    //自定义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<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
    @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<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);

    @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();
}

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

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值