diff --git a/src/NoteApp281/.gitignore b/src/NoteApp281/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/src/NoteApp281/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/src/NoteApp281/.idea/.gitignore b/src/NoteApp281/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/src/NoteApp281/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/src/NoteApp281/.idea/compiler.xml b/src/NoteApp281/.idea/compiler.xml new file mode 100644 index 0000000..fb7f4a8 --- /dev/null +++ b/src/NoteApp281/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/NoteApp281/.idea/gradle.xml b/src/NoteApp281/.idea/gradle.xml new file mode 100644 index 0000000..a0de2a1 --- /dev/null +++ b/src/NoteApp281/.idea/gradle.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/src/NoteApp281/.idea/jarRepositories.xml b/src/NoteApp281/.idea/jarRepositories.xml new file mode 100644 index 0000000..c894fb2 --- /dev/null +++ b/src/NoteApp281/.idea/jarRepositories.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/NoteApp281/.idea/misc.xml b/src/NoteApp281/.idea/misc.xml new file mode 100644 index 0000000..860da66 --- /dev/null +++ b/src/NoteApp281/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/src/NoteApp281/app/.gitignore b/src/NoteApp281/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/src/NoteApp281/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/src/NoteApp281/app/build.gradle b/src/NoteApp281/app/build.gradle new file mode 100644 index 0000000..9c05406 --- /dev/null +++ b/src/NoteApp281/app/build.gradle @@ -0,0 +1,39 @@ +plugins { + id 'com.android.application' +} + +android { + compileSdkVersion 30 + buildToolsVersion "30.0.3" + + defaultConfig { + applicationId "com.example.noteapp281" + minSdkVersion 19 + targetSdkVersion 30 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +dependencies { + + implementation 'androidx.appcompat:appcompat:1.2.0' + implementation 'com.google.android.material:material:1.2.1' + implementation 'androidx.constraintlayout:constraintlayout:2.0.4' + testImplementation 'junit:junit:4.+' + androidTestImplementation 'androidx.test.ext:junit:1.1.2' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' +} \ No newline at end of file diff --git a/src/NoteApp281/app/proguard-rules.pro b/src/NoteApp281/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/src/NoteApp281/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/src/NoteApp281/app/src/androidTest/java/com/example/noteapp281/ExampleInstrumentedTest.java b/src/NoteApp281/app/src/androidTest/java/com/example/noteapp281/ExampleInstrumentedTest.java new file mode 100644 index 0000000..2c3ddde --- /dev/null +++ b/src/NoteApp281/app/src/androidTest/java/com/example/noteapp281/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.example.noteapp281; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("com.example.noteapp281", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/src/NoteApp281/app/src/main/AndroidManifest.xml b/src/NoteApp281/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..2603584 --- /dev/null +++ b/src/NoteApp281/app/src/main/AndroidManifest.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/NoteApp281/app/src/main/java/com/example/noteapp281/AddActivity.java b/src/NoteApp281/app/src/main/java/com/example/noteapp281/AddActivity.java new file mode 100644 index 0000000..bda5717 --- /dev/null +++ b/src/NoteApp281/app/src/main/java/com/example/noteapp281/AddActivity.java @@ -0,0 +1,61 @@ +package com.example.noteapp281; + +import androidx.appcompat.app.AppCompatActivity; + +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; + +import com.example.noteapp281.bean.Note; +import com.example.noteapp281.util.ToastUtil; + +import java.text.SimpleDateFormat; +import java.util.Date; + +public class AddActivity extends AppCompatActivity { + + private EditText etTitle,etContent; + + private NoteDbOpenHelper mNoteDbOpenHelper; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_add); + + etTitle = findViewById(R.id.et_title); + etContent = findViewById(R.id.et_content); + mNoteDbOpenHelper = new NoteDbOpenHelper(this); + + } + + public void add(View view) { + String title = etTitle.getText().toString(); + String content = etContent.getText().toString(); + if (TextUtils.isEmpty(title)) { + ToastUtil.toastShort(this, "标题不能为空!"); + return; + } + + Note note = new Note(); + + note.setTitle(title); + note.setContent(content); + note.setCreatedTime(getCurrentTimeFormat()); + long row = mNoteDbOpenHelper.insertData(note); + if (row != -1) { + ToastUtil.toastShort(this,"添加成功!"); + this.finish(); + }else { + ToastUtil.toastShort(this,"添加失败!"); + } + + } + + private String getCurrentTimeFormat() { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("YYYY年MM月dd HH:mm:ss"); + Date date = new Date(); + return simpleDateFormat.format(date); + } +} \ No newline at end of file diff --git a/src/NoteApp281/app/src/main/java/com/example/noteapp281/EditActivity.java b/src/NoteApp281/app/src/main/java/com/example/noteapp281/EditActivity.java new file mode 100644 index 0000000..fc3871a --- /dev/null +++ b/src/NoteApp281/app/src/main/java/com/example/noteapp281/EditActivity.java @@ -0,0 +1,71 @@ +package com.example.noteapp281; + +import androidx.appcompat.app.AppCompatActivity; + +import android.content.Intent; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; + +import com.example.noteapp281.bean.Note; +import com.example.noteapp281.util.ToastUtil; + +import java.text.SimpleDateFormat; +import java.util.Date; + +public class EditActivity extends AppCompatActivity { + + private Note note; + private EditText etTitle,etContent; + + private NoteDbOpenHelper mNoteDbOpenHelper; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_edit); + + etTitle = findViewById(R.id.et_title); + etContent = findViewById(R.id.et_content); + + initData(); + + } + + private void initData() { + Intent intent = getIntent(); + note = (Note) intent.getSerializableExtra("note"); + if (note != null) { + etTitle.setText(note.getTitle()); + etContent.setText(note.getContent()); + } + mNoteDbOpenHelper = new NoteDbOpenHelper(this); + } + + public void save(View view) { + String title = etTitle.getText().toString(); + String content = etContent.getText().toString(); + if (TextUtils.isEmpty(title)) { + ToastUtil.toastShort(this, "标题不能为空!"); + return; + } + + note.setTitle(title); + note.setContent(content); + note.setCreatedTime(getCurrentTimeFormat()); + long rowId = mNoteDbOpenHelper.updateData(note); + if (rowId != -1) { + ToastUtil.toastShort(this, "修改成功!"); + this.finish(); + }else{ + ToastUtil.toastShort(this, "修改失败!"); + } + + } + + private String getCurrentTimeFormat() { + SimpleDateFormat sdf = new SimpleDateFormat("YYYY年MM月dd日 HH:mm:ss"); + Date date = new Date(); + return sdf.format(date); + } +} \ No newline at end of file diff --git a/src/NoteApp281/app/src/main/java/com/example/noteapp281/MainActivity.java b/src/NoteApp281/app/src/main/java/com/example/noteapp281/MainActivity.java new file mode 100644 index 0000000..fc6b591 --- /dev/null +++ b/src/NoteApp281/app/src/main/java/com/example/noteapp281/MainActivity.java @@ -0,0 +1,191 @@ +package com.example.noteapp281; + +import android.app.SearchManager; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.SearchView; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.example.noteapp281.adapter.MyAdapter; +import com.example.noteapp281.bean.Note; +import com.example.noteapp281.util.SpfUtil; +import com.google.android.material.floatingactionbutton.FloatingActionButton; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class MainActivity extends AppCompatActivity { + + private RecyclerView mRecyclerView; + private FloatingActionButton mBtnAdd; + private List mNotes; + private MyAdapter mMyAdapter; + + private NoteDbOpenHelper mNoteDbOpenHelper; + + public static final int MODE_LINEAR = 0; + public static final int MODE_GRID = 1; + + public static final String KEY_LAYOUT_MODE = "key_layout_mode"; + + private int currentListLayoutMode = MODE_LINEAR; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + initView(); + initData(); + initEvent(); + } + + @Override + protected void onResume() { + super.onResume(); + refreshDataFromDb(); + setListLayout(); + } + + private void setListLayout() { + currentListLayoutMode = SpfUtil.getIntWithDefault(this, KEY_LAYOUT_MODE, MODE_LINEAR); + if (currentListLayoutMode == MODE_LINEAR) { + setToLinearList(); + }else{ + setToGridList(); + } + } + + private void refreshDataFromDb() { + mNotes = getDataFromDB(); + mMyAdapter.refreshData(mNotes); + } + + private void initEvent() { + mMyAdapter = new MyAdapter(this, mNotes); + mRecyclerView.setAdapter(mMyAdapter); +// LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); +// mRecyclerView.setLayoutManager(linearLayoutManager); +// mMyAdapter.setViewType(MyAdapter.TYPE_LINEAR_LAYOUT); + setListLayout(); + + } + + private void initData() { + mNotes = new ArrayList<>(); + mNoteDbOpenHelper = new NoteDbOpenHelper(this); +// +// for (int i = 0; i < 30; i++) { +// Note note = new Note(); +// note.setTitle("这是标题"+i); +// note.setContent("这是内容"+i); +// note.setCreatedTime(getCurrentTimeFormat()); +// mNotes.add(note); +// } + +// mNotes = getDataFromDB(); + + } + + private List getDataFromDB() { + return mNoteDbOpenHelper.queryAllFromDb(); + } + + private String getCurrentTimeFormat() { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd HH:mm:ss"); + Date date = new Date(); + return simpleDateFormat.format(date); + } + + private void initView() { + mRecyclerView = findViewById(R.id.rlv); + } + + + public void add(View view) { + Intent intent = new Intent(this, AddActivity.class); + startActivity(intent); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.menu_main, menu); + SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView(); + + searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { + @Override + public boolean onQueryTextSubmit(String query) { + return false; + } + + @Override + public boolean onQueryTextChange(String newText) { + mNotes = mNoteDbOpenHelper.queryFromDbByTitle(newText); + mMyAdapter.refreshData(mNotes); + return true; + } + }); + return super.onCreateOptionsMenu(menu); + } + + + @Override + public boolean onOptionsItemSelected(@NonNull MenuItem item) { + item.setChecked(true); + + switch (item.getItemId()) { + + case R.id.menu_linear: + setToLinearList(); + currentListLayoutMode = MODE_LINEAR; + SpfUtil.saveInt(this,KEY_LAYOUT_MODE,MODE_LINEAR); + + return true; + case R.id.menu_grid: + + setToGridList(); + currentListLayoutMode = MODE_GRID; + SpfUtil.saveInt(this,KEY_LAYOUT_MODE,MODE_GRID); + return true; + default: + return super.onOptionsItemSelected(item); + + } + } + + private void setToLinearList() { + RecyclerView.LayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false); + mRecyclerView.setLayoutManager(linearLayoutManager); + mMyAdapter.setViewType(MyAdapter.TYPE_LINEAR_LAYOUT); + mMyAdapter.notifyDataSetChanged(); + } + + + private void setToGridList() { + RecyclerView.LayoutManager gridLayoutManager = new GridLayoutManager(this, 2); + mRecyclerView.setLayoutManager(gridLayoutManager); + mMyAdapter.setViewType(MyAdapter.TYPE_GRID_LAYOUT); + mMyAdapter.notifyDataSetChanged(); + } + + @Override + public boolean onPrepareOptionsMenu(Menu menu) { + if (currentListLayoutMode == MODE_LINEAR) { + MenuItem item = menu.findItem(R.id.menu_linear); + item.setChecked(true); + } else { + menu.findItem(R.id.menu_grid).setChecked(true); + } + return super.onPrepareOptionsMenu(menu); + } +} \ No newline at end of file diff --git a/src/NoteApp281/app/src/main/java/com/example/noteapp281/NoteDbOpenHelper.java b/src/NoteApp281/app/src/main/java/com/example/noteapp281/NoteDbOpenHelper.java new file mode 100644 index 0000000..75841a4 --- /dev/null +++ b/src/NoteApp281/app/src/main/java/com/example/noteapp281/NoteDbOpenHelper.java @@ -0,0 +1,130 @@ +package com.example.noteapp281; + +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; +import android.text.TextUtils; + +import com.example.noteapp281.bean.Note; + +import java.util.ArrayList; +import java.util.List; + +public class NoteDbOpenHelper extends SQLiteOpenHelper { + + private static final String DB_NAME = "noteSQLite.db"; + private static final String TABLE_NAME_NOTE = "note"; + + private static final String CREATE_TABLE_SQL = "create table " + TABLE_NAME_NOTE + " (id integer primary key autoincrement, title text, content text, create_time text)"; + + + public NoteDbOpenHelper(Context context) { + super(context, DB_NAME, null, 1); + } + + + + @Override + public void onCreate(SQLiteDatabase db) { + db.execSQL(CREATE_TABLE_SQL); + + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + + } + + public long insertData(Note note) { + + SQLiteDatabase db = getWritableDatabase(); + + ContentValues values = new ContentValues(); + values.put("title", note.getTitle()); + values.put("content", note.getContent()); + values.put("create_time", note.getCreatedTime()); + + return db.insert(TABLE_NAME_NOTE, null, values); + } + + public int deleteFromDbById(String id) { + SQLiteDatabase db = getWritableDatabase(); +// return db.delete(TABLE_NAME_NOTE, "id = ?", new String[]{id}); +// return db.delete(TABLE_NAME_NOTE, "id is ?", new String[]{id}); + return db.delete(TABLE_NAME_NOTE, "id like ?", new String[]{id}); + } + + public int updateData(Note note) { + + SQLiteDatabase db = getWritableDatabase(); + + ContentValues values = new ContentValues(); + values.put("title", note.getTitle()); + values.put("content", note.getContent()); + values.put("create_time", note.getCreatedTime()); + + return db.update(TABLE_NAME_NOTE, values, "id like ?", new String[]{note.getId()}); + } + + public List queryAllFromDb() { + + SQLiteDatabase db = getWritableDatabase(); + List noteList = new ArrayList<>(); + + Cursor cursor = db.query(TABLE_NAME_NOTE, null, null, null, null, null, null); + if (cursor != null) { + while (cursor.moveToNext()) { + String id = cursor.getString(cursor.getColumnIndex("id")); + String title = cursor.getString(cursor.getColumnIndex("title")); + String content = cursor.getString(cursor.getColumnIndex("content")); + String createTime = cursor.getString(cursor.getColumnIndex("create_time")); + + Note note = new Note(); + note.setId(id); + note.setTitle(title); + note.setContent(content); + note.setCreatedTime(createTime); + + noteList.add(note); + } + cursor.close(); + } + + return noteList; + + } + + public List queryFromDbByTitle(String title) { + if (TextUtils.isEmpty(title)) { + return queryAllFromDb(); + } + + SQLiteDatabase db = getWritableDatabase(); + List noteList = new ArrayList<>(); + + Cursor cursor = db.query(TABLE_NAME_NOTE, null, "title like ?", new String[]{"%"+title+"%"}, null, null, null); + + if (cursor != null) { + + while (cursor.moveToNext()) { + String id = cursor.getString(cursor.getColumnIndex("id")); + String title2 = cursor.getString(cursor.getColumnIndex("title")); + String content = cursor.getString(cursor.getColumnIndex("content")); + String createTime = cursor.getString(cursor.getColumnIndex("create_time")); + + Note note = new Note(); + note.setId(id); + note.setTitle(title2); + note.setContent(content); + note.setCreatedTime(createTime); + noteList.add(note); + } + cursor.close(); + } + return noteList; + } + + +} diff --git a/src/NoteApp281/app/src/main/java/com/example/noteapp281/adapter/MyAdapter.java b/src/NoteApp281/app/src/main/java/com/example/noteapp281/adapter/MyAdapter.java new file mode 100644 index 0000000..72cb160 --- /dev/null +++ b/src/NoteApp281/app/src/main/java/com/example/noteapp281/adapter/MyAdapter.java @@ -0,0 +1,230 @@ +package com.example.noteapp281.adapter; + +import android.app.Dialog; +import android.content.Context; +import android.content.Intent; +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.noteapp281.EditActivity; +import com.example.noteapp281.NoteDbOpenHelper; +import com.example.noteapp281.R; +import com.example.noteapp281.bean.Note; +import com.example.noteapp281.util.ToastUtil; + +import java.util.List; + +public class MyAdapter extends RecyclerView.Adapter { + + private List mBeanList; + private LayoutInflater mLayoutInflater; + private Context mContext; + + private NoteDbOpenHelper mNoteDbOpenHelper; + + private int viewType; + + public static int TYPE_LINEAR_LAYOUT = 0; + public static int TYPE_GRID_LAYOUT = 1; + + public MyAdapter(Context context, List mBeanList){ + this.mBeanList = mBeanList; + this.mContext = context; + mLayoutInflater = LayoutInflater.from(mContext); + mNoteDbOpenHelper = new NoteDbOpenHelper(mContext); + } + + public void setViewType(int viewType) { + this.viewType = viewType; + } + + @Override + public int getItemViewType(int position) { + return viewType; + } + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + if(viewType == TYPE_LINEAR_LAYOUT){ + View view = mLayoutInflater.inflate(R.layout.list_item_layout, parent, false); + MyViewHolder myViewHolder = new MyViewHolder(view); + return myViewHolder; + }else if(viewType == TYPE_GRID_LAYOUT){ + View view = mLayoutInflater.inflate(R.layout.list_item_grid_layout, parent, false); + MyGridViewHolder myGridViewHolder = new MyGridViewHolder(view); + return myGridViewHolder; + } + + return null; + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + if (holder == null) { + return; + } + if(holder instanceof MyViewHolder){ + bindMyViewHolder((MyViewHolder) holder, position); + } else if (holder instanceof MyGridViewHolder) { + bindGridViewHolder((MyGridViewHolder) holder, position); + } + } + + private void bindMyViewHolder(MyViewHolder holder, int position) { + Note note = mBeanList.get(position); + holder.mTvTitle.setText(note.getTitle()); + holder.mTvContent.setText(note.getContent()); + holder.mTvTime.setText(note.getCreatedTime()); + holder.rlContainer.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + Intent intent = new Intent(mContext, EditActivity.class); + intent.putExtra("note", note); + mContext.startActivity(intent); + } + }); + + holder.rlContainer.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + // 弹出弹窗 + Dialog dialog = new Dialog(mContext, android.R.style.ThemeOverlay_Material_Dialog_Alert); + View dialogView = mLayoutInflater.inflate(R.layout.list_item_dialog_layout, null); + TextView tvDelete = dialogView.findViewById(R.id.tv_delete); + TextView tvEdit = dialogView.findViewById(R.id.tv_edit); + + tvDelete.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + int row = mNoteDbOpenHelper.deleteFromDbById(note.getId()); + if (row > 0) { + removeData(position); + } + dialog.dismiss(); + } + }); + + + tvEdit.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(mContext, EditActivity.class); + intent.putExtra("note", note); + mContext.startActivity(intent); + dialog.dismiss(); + } + }); + dialog.setContentView(dialogView); + dialog.setCanceledOnTouchOutside(true); + dialog.show(); + return true; + } + }); + } + + + private void bindGridViewHolder(MyGridViewHolder holder, int position) { + Note note = mBeanList.get(position); + holder.mTvTitle.setText(note.getTitle()); + holder.mTvContent.setText(note.getContent()); + holder.mTvTime.setText(note.getCreatedTime()); + holder.rlContainer.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + Intent intent = new Intent(mContext, EditActivity.class); + intent.putExtra("note", note); + mContext.startActivity(intent); + } + }); + + holder.rlContainer.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + // 弹出弹窗 + Dialog dialog = new Dialog(mContext, android.R.style.ThemeOverlay_Material_Dialog_Alert); + View dialogView = mLayoutInflater.inflate(R.layout.list_item_dialog_layout, null); + TextView tvDelete = dialogView.findViewById(R.id.tv_delete); + TextView tvEdit = dialogView.findViewById(R.id.tv_edit); + + tvDelete.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + int row = mNoteDbOpenHelper.deleteFromDbById(note.getId()); + if (row > 0) { + removeData(position); + } + dialog.dismiss(); + } + }); + + + tvEdit.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(mContext, EditActivity.class); + intent.putExtra("note", note); + mContext.startActivity(intent); + dialog.dismiss(); + } + }); + dialog.setContentView(dialogView); + dialog.setCanceledOnTouchOutside(true); + dialog.show(); + return true; + } + }); + } + + @Override + public int getItemCount() { + return mBeanList.size(); + } + + public void refreshData(List notes) { + this.mBeanList = notes; + notifyDataSetChanged(); + } + + public void removeData(int pos) { + mBeanList.remove(pos); + notifyItemRemoved(pos); + } + + class MyViewHolder extends RecyclerView.ViewHolder{ + TextView mTvTitle; + TextView mTvContent; + TextView mTvTime; + ViewGroup rlContainer; + public MyViewHolder(@NonNull View itemView) { + super(itemView); + this.mTvTitle = itemView.findViewById(R.id.tv_title); + this.mTvContent = itemView.findViewById(R.id.tv_content); + this.mTvTime = itemView.findViewById(R.id.tv_time); + this.rlContainer = itemView.findViewById(R.id.rl_item_container); + } + } + + class MyGridViewHolder extends RecyclerView.ViewHolder{ + + TextView mTvTitle; + TextView mTvContent; + TextView mTvTime; + ViewGroup rlContainer; + + public MyGridViewHolder(@NonNull View itemView) { + super(itemView); + this.mTvTitle = itemView.findViewById(R.id.tv_title); + this.mTvContent = itemView.findViewById(R.id.tv_content); + this.mTvTime = itemView.findViewById(R.id.tv_time); + this.rlContainer = itemView.findViewById(R.id.rl_item_container); + } + } +} diff --git a/src/NoteApp281/app/src/main/java/com/example/noteapp281/bean/Note.java b/src/NoteApp281/app/src/main/java/com/example/noteapp281/bean/Note.java new file mode 100644 index 0000000..1edafee --- /dev/null +++ b/src/NoteApp281/app/src/main/java/com/example/noteapp281/bean/Note.java @@ -0,0 +1,54 @@ +package com.example.noteapp281.bean; + +import java.io.Serializable; + +public class Note implements Serializable { + + private String title; + private String content; + private String createdTime; + private String id; + + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(String createdTime) { + this.createdTime = createdTime; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + @Override + public String toString() { + return "Note{" + + "title='" + title + '\'' + + ", content='" + content + '\'' + + ", createdTime='" + createdTime + '\'' + + ", id='" + id + '\'' + + '}'; + } +} diff --git a/src/NoteApp281/app/src/main/java/com/example/noteapp281/util/SpfUtil.java b/src/NoteApp281/app/src/main/java/com/example/noteapp281/util/SpfUtil.java new file mode 100644 index 0000000..5094e45 --- /dev/null +++ b/src/NoteApp281/app/src/main/java/com/example/noteapp281/util/SpfUtil.java @@ -0,0 +1,38 @@ +package com.example.noteapp281.util; + +import android.content.Context; +import android.content.SharedPreferences; + +public class SpfUtil { + + private static String SPF_NAME = "noteSpf"; + + public static void saveString(Context context, String key, String value) { + SharedPreferences spf = context.getSharedPreferences(SPF_NAME, Context.MODE_PRIVATE); + SharedPreferences.Editor edit = spf.edit(); + edit.putString(key, value); + edit.apply(); + } + + public static String getString(Context context, String key) { + SharedPreferences spf = context.getSharedPreferences(SPF_NAME, Context.MODE_PRIVATE); + return spf.getString(key, ""); + } + + public static void saveInt(Context context, String key, int value) { + SharedPreferences spf = context.getSharedPreferences(SPF_NAME, Context.MODE_PRIVATE); + SharedPreferences.Editor edit = spf.edit(); + edit.putInt(key, value); + edit.apply(); + } + + public static int getInt(Context context, String key) { + SharedPreferences spf = context.getSharedPreferences(SPF_NAME, Context.MODE_PRIVATE); + return spf.getInt(key, -1); + } + + public static int getIntWithDefault(Context context, String key, int defValue) { + SharedPreferences spf = context.getSharedPreferences(SPF_NAME, Context.MODE_PRIVATE); + return spf.getInt(key, defValue); + } +} diff --git a/src/NoteApp281/app/src/main/java/com/example/noteapp281/util/ToastUtil.java b/src/NoteApp281/app/src/main/java/com/example/noteapp281/util/ToastUtil.java new file mode 100644 index 0000000..4874857 --- /dev/null +++ b/src/NoteApp281/app/src/main/java/com/example/noteapp281/util/ToastUtil.java @@ -0,0 +1,15 @@ +package com.example.noteapp281.util; + +import android.content.Context; +import android.widget.Toast; + +public class ToastUtil { + + public static void toastShort(Context context, String msg) { + Toast.makeText(context, msg, Toast.LENGTH_SHORT).show(); + } + + public static void toastLong(Context context, String msg) { + Toast.makeText(context, msg, Toast.LENGTH_LONG).show(); + } +} diff --git a/src/NoteApp281/app/src/main/res/drawable-v24/btn_bg_selector.xml b/src/NoteApp281/app/src/main/res/drawable-v24/btn_bg_selector.xml new file mode 100644 index 0000000..7db80c3 --- /dev/null +++ b/src/NoteApp281/app/src/main/res/drawable-v24/btn_bg_selector.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/NoteApp281/app/src/main/res/drawable-v24/edit_text_bg.xml b/src/NoteApp281/app/src/main/res/drawable-v24/edit_text_bg.xml new file mode 100644 index 0000000..acab058 --- /dev/null +++ b/src/NoteApp281/app/src/main/res/drawable-v24/edit_text_bg.xml @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/src/NoteApp281/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/src/NoteApp281/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/src/NoteApp281/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/src/NoteApp281/app/src/main/res/drawable/btn_bg_selector.xml b/src/NoteApp281/app/src/main/res/drawable/btn_bg_selector.xml new file mode 100644 index 0000000..cf81be9 --- /dev/null +++ b/src/NoteApp281/app/src/main/res/drawable/btn_bg_selector.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/NoteApp281/app/src/main/res/drawable/edit_text_bg.xml b/src/NoteApp281/app/src/main/res/drawable/edit_text_bg.xml new file mode 100644 index 0000000..acab058 --- /dev/null +++ b/src/NoteApp281/app/src/main/res/drawable/edit_text_bg.xml @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/src/NoteApp281/app/src/main/res/drawable/ic_baseline_search_24.xml b/src/NoteApp281/app/src/main/res/drawable/ic_baseline_search_24.xml new file mode 100644 index 0000000..e2dd96c --- /dev/null +++ b/src/NoteApp281/app/src/main/res/drawable/ic_baseline_search_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/src/NoteApp281/app/src/main/res/drawable/ic_launcher_background.xml b/src/NoteApp281/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..257a721 --- /dev/null +++ b/src/NoteApp281/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/NoteApp281/app/src/main/res/layout/activity_add.xml b/src/NoteApp281/app/src/main/res/layout/activity_add.xml new file mode 100644 index 0000000..9f98789 --- /dev/null +++ b/src/NoteApp281/app/src/main/res/layout/activity_add.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + +