You are on page 1of 31

1) DAO

- Trong Android, DAO (Data Access Object) là một phần của mô


hình thiết kế kiến trúc (architecture) được sử dụng để truy cập
và quản lý dữ liệu từ cơ sở dữ liệu hoặc bất kỳ nguồn dữ liệu
nào khác

- Cụ thể trong Android, DAO thường được sử dụng để tương


tác với cơ sở dữ liệu Room hoặc SQLite, nhằm thực hiện các
thao tác như truy vấn, chèn, cập nhật hoặc xóa dữ liệu. DAO
giúp tách lớp dữ liệu (data layer) và logic kinh doanh (business
logic) ra khỏi nhau, giúp mã của bạn dễ bảo trì và tái sử dụng
hơn.
Đoạn mã trên đây định nghĩa một interface NotesDao, được sử dụng để tương tác
với cơ sở dữ liệu Room trong ứng dụng Android. Dưới đây là giải thích từng
phương thức:

1. @Query("SELECT * FROM Notes_Database") : Đây là một annotation được sử


dụng để xác định một truy vấn SQL. Trong trường hợp này, truy vấn này lấy
tất cả các dòng từ bảng Notes_Database.
2. LiveData<List<Notes>> getallNotes(); : Phương thức này trả về một LiveData
chứa danh sách các ghi chú (Notes). LiveData là một lớp được cung cấp bởi
Android Jetpack, giúp quản lý trạng thái dữ liệu.
3. @Insert: Annotation này xác định rằng phương thức được gắn với việc chèn
dữ liệu vào cơ sở dữ liệu. Trong trường hợp này, nó được sử dụng để chèn
một hoặc nhiều ghi chú vào cơ sở dữ liệu.
4. void insertNotes(Notes... notes); : Phương thức này chấp nhận một mảng các đối
tượng ghi chú và chèn chúng vào cơ sở dữ liệu.
5. @Query("DELETE FROM Notes_Database WHERE id =:id") : Annotation này xác
định một truy vấn SQL để xóa dữ liệu từ cơ sở dữ liệu. Trong trường hợp
này, nó được sử dụng để xóa một ghi chú dựa trên id.
6. void deleteNotes(int id);: Phương thức này xóa một ghi chú từ cơ sở dữ liệu
dựa trên id đã cung cấp.
7. @Update: Annotation này xác định rằng phương thức được sử dụng để cập
nhật dữ liệu trong cơ sở dữ liệu.
8. void updateNotes(Notes notes);: Phương thức này cập nhật thông tin của một
ghi chú đã tồn tại trong cơ sở dữ liệu.

Lớp NotesDatabase
-Đoạn mã trên định nghĩa một lớp NotesDatabase, là một lớp trừu tượng
kế thừa từ RoomDatabase, được sử dụng để tạo và quản lý cơ sở dữ liệu
Room trong ứng dụng Android. Dưới đây là giải thích từng phần:

1. @Database(entities = {Notes.class}, version = 1, exportSchema = false) :


Annotation này đánh dấu lớp NotesDatabase là một cơ sở dữ liệu
Room. Trong đó:
 entities = {Notes.class} : Xác định các entity (bảng) có trong cơ
sở dữ liệu. Trong trường hợp này, chỉ có một entity là Notes.
 version = 1: Xác định phiên bản của cơ sở dữ liệu.
 exportSchema = false : Đặt thành false để ngăn Room tạo ra
một tệp schema (sơ đồ) khi tạo cơ sở dữ liệu.
2. public abstract NotesDao notesDao();: Phương thức trừu tượng này
cung cấp một đối tượng DAO ( NotesDao) để thực hiện các thao
tác trên cơ sở dữ liệu.
3. public static NotesDatabase INSTANCE;: Biến static INSTANCE được sử
dụng để lưu trữ một thể hiện duy nhất của lớp NotesDatabase.
4. public static NotesDatabase getDatabaseInstance(Context context) { ... }:
Phương thức này được sử dụng để tạo hoặc lấy ra đối tượng cơ
sở dữ liệu. Nếu INSTANCE chưa được khởi tạo, nó sẽ tạo một thể
hiện mới của NotesDatabase bằng cách sử dụng
Room.databaseBuilder() và lưu trữ vào INSTANCE. Phương thức này
cũng đảm bảo rằng chỉ có một thể hiện duy nhất của cơ sở dữ
liệu được tạo ra trong suốt vòng đời của ứng dụng.

-Lớp Notes:
1. @Entity(tableName = "Notes_Database"): Annotation này đánh dấu
lớp Notes là một entity trong cơ sở dữ liệu Room. Trong đó:
 tableName = "Notes_Database": Xác định tên của bảng trong cơ
sở dữ liệu. Trong trường hợp này, tên bảng là
"Notes_Database".
2. @PrimaryKey(autoGenerate = true): Annotation này xác định trường
id là khóa chính của entity, và nó sẽ tự động tăng dần khi một
bản ghi mới được chèn vào cơ sở dữ liệu.
3. @ColumnInfo(name = "notes_title"): Annotation này đánh dấu trường
notesTitle và xác định tên của cột tương ứng trong bảng cơ sở dữ
liệu là "notes_title".
4. public int id;: Trường id được sử dụng làm khóa chính của entity,
và nó được tự động tăng dần.
5. public String notesTitle;, public String notesSubTitle;, public String
notesDate;, public String notes;, public String notesPriority;: Các trường
này là các cột trong bảng cơ sở dữ liệu. Mỗi trường tương ứng
với một cột trong bảng, và thông qua các Annotation
@ColumnInfo, bạn có thể xác định tên của các cột này.

Tổng thể, lớp Notes đóng vai trò là một mô hình dữ liệu (data model)
trong ứng dụng, định nghĩa cấu trúc dữ liệu của một ghi chú (note)
trong cơ sở dữ liệu Room, bao gồm các trường như tiêu đề, phụ đề,
ngày, nội dung và mức độ ưu tiên.
-Lớp NotesRepository

Đoạn mã trên định nghĩa một lớp NotesRepository, được sử dụng để


tương tác với cơ sở dữ liệu và cung cấp dữ liệu cho giao diện người
dùng thông qua các LiveData. Dưới đây là giải thích từng phần:
1. public NotesDao notesDao;: Đối tượng notesDao được sử dụng để thực
hiện các thao tác trên cơ sở dữ liệu thông qua các phương thức
được định nghĩa trong interface NotesDao.
2. public LiveData<List<Notes>> getallNotes;, public LiveData<List<Notes>>
highToLow;, public LiveData<List<Notes>> lowToHigh; : Các đối tượng
LiveData này lưu trữ danh sách các ghi chú (Notes) được truy vấn
từ cơ sở dữ liệu. Các LiveData này được sử dụng để quan sát sự
thay đổi trong dữ liệu và cập nhật giao diện người dùng một
cách tự động khi dữ liệu thay đổi.
3. public NotesRepository(Application application) { ... }: Constructor của
lớp NotesRepository nhận một đối tượng Application làm tham số
và sử dụng nó để tạo một đối tượng cơ sở dữ liệu ( notesDatabase)
thông qua phương thức NotesDatabase.getDatabaseInstance(). Sau đó,
nó lấy ra đối tượng notesDao từ cơ sở dữ liệu và gán cho các biến
LiveData getallNotes, highToLow và lowToHigh.
4. public void insertNotes(Notes notes) { ... }, public void deleteNotes(int id)
{ ... }, public void updateNotes(Notes notes) { ... }: Các phương thức này
được sử dụng để chèn, xóa và cập nhật ghi chú trong cơ sở dữ
liệu thông qua notesDao. Các phương thức này chỉ đơn giản là
chuyển tiếp các thao tác đến notesDao tương ứng.

Tổng thể, lớp NotesRepository đóng vai trò trung gian giữa ViewModel
và cơ sở dữ liệu, cung cấp dữ liệu từ cơ sở dữ liệu cho ViewModel
thông qua các LiveData, và cung cấp các phương thức để thực hiện
các thao tác CRUD (create, read, update, delete) trên dữ liệu.

-Lớp NotesViewModel
Lớp NotesViewModel trong đoạn mã trên là một lớp ViewModel trong
kiến trúc MVVM (Model-View-ViewModel) của ứng dụng Android.
Dưới đây là giải thích từng phần của lớp này:

1. public class NotesViewModel extends AndroidViewModel { ... } : Lớp


NotesViewModel kế thừa từ AndroidViewModel, cho phép nó truy cập
vào Application context và sử dụng trong toàn bộ ứng dụng.
2. public NotesRepository repository;: Đối tượng repository được sử dụng
để tương tác với dữ liệu thông qua các phương thức được cung
cấp bởi NotesRepository.
3. public LiveData<List<Notes>> getallNotes;, public LiveData<List<Notes>>
highToLow;, public LiveData<List<Notes>> lowToHigh; : Các biến
LiveData này lưu trữ danh sách các ghi chú (Notes) từ các truy
vấn cơ sở dữ liệu khác nhau. Các LiveData này được quan sát từ
View để cập nhật giao diện người dùng khi dữ liệu thay đổi.
4. Constructor public NotesViewModel(Application application) { ... } :
Constructor này khởi tạo một đối tượng NotesRepository và lấy ra
các LiveData từ repository.
5. public void insertNote(Notes notes) { ... }, public void updateNote(Notes
notes) { ... }, public void deleteNote(int id) { ... }: Các phương thức này
được sử dụng để thực hiện các thao tác CRUD (create, read,
update, delete) trên dữ liệu thông qua NotesRepository. Chúng
được gọi từ View để thực hiện các hành động tương ứng trên dữ
liệu.

Tóm lại, NotesViewModel là lớp trung gian giữa View (Activity hoặc
Fragment) và Repository, cung cấp dữ liệu từ repository cho View và
xử lý các tương tác từ View để thay đổi dữ liệu. Lớp này giúp tách biệt
logic kinh doanh và giao diện người dùng trong ứng dụng.

-Lớp AddNotesActivity
Trong AddNoteActivity, có một số hành động được thực hiện:

1. Khai báo biến và tạo đối tượng ViewModel: Biến


notesViewModel được khai báo để sử dụng ViewModel để thao tác
với dữ liệu ghi chú. Trong phương thức onCreate(), đối tượng
ViewModel được tạo bằng cách sử dụng
ViewModelProviders.of(this).get(NotesViewModel.class) .
2. Xử lý sự kiện click trên các nút ưu tiên (priority): Các nút ưu
tiên được gán các sự kiện click tương ứng để người dùng có thể
chọn mức độ ưu tiên của ghi chú. Khi người dùng click vào một
nút ưu tiên, hình ảnh của nút đó sẽ thay đổi và biến priority sẽ
được cập nhật tương ứng.
3. Xử lý sự kiện click trên nút "Done" để tạo ghi chú mới: Khi
người dùng click vào nút "Done", dữ liệu từ các trường tiêu đề,
phụ đề và nội dung ghi chú được lấy ra và sử dụng để tạo một
đối tượng ghi chú ( Notes). Đồng thời, ngày hiện tại cũng được lấy
ra và định dạng dưới dạng chuỗi. Đối tượng Notes được tạo và
gửi tới ViewModel thông qua phương thức insertNote() để được
chèn vào cơ sở dữ liệu.
4. Hiển thị thông báo và kết thúc hoạt động: Sau khi tạo ghi chú
thành công, một thông báo ngắn sẽ được hiển thị và hoạt động
AddNoteActivity sẽ kết thúc, trở lại hoạt động trước đó.

Tóm lại, trong AddNoteActivity, người dùng có thể nhập thông tin cho
một ghi chú mới và chọn mức độ ưu tiên tương ứng. Khi nhấn vào nút
"Done", ghi chú mới sẽ được tạo và lưu vào cơ sở dữ liệu.
-Lớp SplashActivity
Activity SplashActivity trong mã trên là một hoạt động khởi đầu trong ứng dụng Android, được
sử dụng để hiển thị màn hình chào mừng ngắn trước khi chuyển đến màn hình chính của ứng
dụng. Dưới đây là giải thích về mã này:

1. Khai báo và khởi tạo: Trong phương thức onCreate(), định dạng giao diện của
SplashActivity được thiết lập bằng cách sử dụng phương thức setContentView() để đặt
layout từ tệp activity_splash.xml. Sau đó, thanh action bar được ẩn đi bằng cách gọi
getSupportActionBar().hide() .
2. Sử dụng Handler và postDelayed(): Một Handler được sử dụng để tạm dừng việc
chuyển đến màn hình chính (MainActivity) trong một khoảng thời gian nhất định. Phương
thức postDelayed() được gọi với thời gian trễ là 3000 milliseconds (tức là 3 giây). Trong
phương thức run() của Runnable, một Intent được tạo để chuyển đến MainActivity và
finishAffinity() được gọi để kết thúc tất cả các hoạt động hiện tại trong ngăn xếp hoạt
động.
3. Chuyển đến MainActivity: Sau khi thời gian trễ đã kết thúc, Intent được gọi để chuyển
đến MainActivity. finishAffinity() đảm bảo rằng tất cả các hoạt động trước đó trong ngăn
xếp hoạt động cũng sẽ bị kết thúc, vì vậy khi người dùng nhấn nút Back, họ sẽ không
quay lại màn hình chào mừng.

Tóm lại, SplashActivity là một hoạt động khởi đầu ngắn trong ứng dụng Android, được sử dụng
để hiển thị màn hình chào mừng trước khi chuyển đến màn hình chính của ứng dụng.

-Lớp UploadNoteActivity
Activity UpdateNoteActivity trong đoạn mã trên là một hoạt động trong ứng dụng Android được
sử dụng để cập nhật ghi chú đã tồn tại. Dưới đây là giải thích về mã này:

1. Khai báo và khởi tạo: Trong phương thức onCreate(), định dạng giao diện của
UpdateNoteActivity được thiết lập bằng cách sử dụng phương thức setContentView() để đặt
layout từ tệp activity_update_note.xml.
2. Nhận dữ liệu từ Intent và hiển thị: Dữ liệu về tiêu đề, phụ đề, nội dung và mức độ ưu
tiên của ghi chú cần được cập nhật được nhận từ Intent và hiển thị trên giao diện người
dùng.
3. Thiết lập sự kiện click cho các nút ưu tiên (priority): Tương tự như trong các hoạt
động khác, các nút ưu tiên được gán các sự kiện click tương ứng để người dùng có thể
chọn mức độ ưu tiên của ghi chú.
4. Cập nhật ghi chú: Khi người dùng nhấn nút "Update Note", dữ liệu mới của ghi chú
(tiêu đề, phụ đề, nội dung và mức độ ưu tiên) được lấy ra từ các trường nhập liệu và gửi
đến ViewModel để thực hiện cập nhật trong cơ sở dữ liệu.
5. Hiển thị menu xóa và xử lý sự kiện xóa: Trong phương thức onCreateOptionsMenu(),
menu được thiết lập bằng cách sử dụng getMenuInflater().inflate() để tạo menu từ tệp
delete_menu.xml. Khi người dùng nhấn vào menu xóa, một BottomSheetDialog được hiển
thị để xác nhận xóa ghi chú. Nếu người dùng xác nhận, ghi chú sẽ được xóa khỏi cơ sở
dữ liệu thông qua ViewModel.

Tóm lại, UpdateNoteActivity cho phép người dùng cập nhật thông tin của ghi chú đã tồn tại và
cung cấp chức năng xóa ghi chú.
package com.trodev.myethicnotes.activities;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.ViewModelProviders;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.text.format.DateFormat;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.material.bottomsheet.BottomSheetDialog;
import com.trodev.myethicnotes.Model.Notes;
import com.trodev.myethicnotes.R;
import com.trodev.myethicnotes.ViewModel.NotesViewModel;
import com.trodev.myethicnotes.databinding.ActivityUpdateNoteBinding;

import java.util.Date;

public class UpdateNoteActivity extends AppCompatActivity {

ActivityUpdateNoteBinding binding;
public String priority = "1";
String stitle, ssubtitle, snotes, spriority;
int sid ;

NotesViewModel notesViewModel;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityUpdateNoteBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());

getSupportActionBar().setTitle("Update Ethic");

//get data on model view


sid = getIntent().getIntExtra("id",0);
stitle = getIntent().getStringExtra("title");
ssubtitle = getIntent().getStringExtra("subtitle");
snotes = getIntent().getStringExtra("notes");
spriority = getIntent().getStringExtra("priority");

//set data on edit text


binding.updateTitile.setText(stitle);
binding.updateSubtitile.setText(ssubtitle);
binding.updateNote.setText(snotes);

if(spriority.equals("1"))
{
binding.greenPriority.setImageResource(R.drawable.ic_done);
}
else if(spriority.equals("2"))
{
binding.yellowPriority.setImageResource(R.drawable.ic_done);
}
else if(spriority.equals("3"))
{
binding.redPriority.setImageResource(R.drawable.ic_done);
}

//get model class to view


notesViewModel =
ViewModelProviders.of(this).get(NotesViewModel.class);

binding.greenPriority.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
binding.greenPriority.setImageResource(R.drawable.ic_done);
binding.yellowPriority.setImageResource(0);
binding.redPriority.setImageResource(0);
priority = "1";
Toast.makeText(UpdateNoteActivity.this, "You select a Low
Priority Navigation", Toast.LENGTH_SHORT).show();
}
});
binding.yellowPriority.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
binding.yellowPriority.setImageResource(R.drawable.ic_done);
binding.greenPriority.setImageResource(0);
binding.redPriority.setImageResource(0);
priority = "2";
Toast.makeText(UpdateNoteActivity.this, "You select a Medium
Priority Navigation", Toast.LENGTH_SHORT).show();
}
});

binding.redPriority.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
binding.redPriority.setImageResource(R.drawable.ic_done);
binding.greenPriority.setImageResource(0);
binding.yellowPriority.setImageResource(0);
priority = "3";
Toast.makeText(UpdateNoteActivity.this, "You select a High
Priority Navigation", Toast.LENGTH_SHORT).show();
}
});

binding.updateNotesBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String title = binding.updateTitile.getText().toString();
String subtitle = binding.updateSubtitile.getText().toString();
String notes = binding.updateNote.getText().toString();

updateNotes(title, subtitle, notes);


}
});

private void updateNotes(String title, String subtitle, String notes) {

// date & format


Date date = new Date();
CharSequence sequence = DateFormat.format("MMMM d, yyyy",
date.getTime());

Notes updatenote = new Notes();


updatenote.id = sid;
updatenote.notesTitle = title;
updatenote.notesSubTitle = subtitle;
updatenote.notes = notes;
updatenote.notesPriority = priority;
updatenote.notesDate = sequence.toString();

notesViewModel.updateNote(updatenote);

Toast.makeText(this, "Notes updated successfully",


Toast.LENGTH_SHORT).show();
finish();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.delete_menu, menu);
return true;
}

@SuppressLint("MissingInflatedId")
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if(item.getItemId() == R.id.delete)
{
BottomSheetDialog sheetDialog = new
BottomSheetDialog(UpdateNoteActivity.this, R.style.BottomSheetStyle);

View view = LayoutInflater.from(UpdateNoteActivity.this)


.inflate(R.layout.delete_bottom_sheet, (LinearLayout)
findViewById(R.id.deleteSheet));

sheetDialog.setContentView(view);

TextView yes, no;

yes = view.findViewById(R.id.delete_yes);
no = view.findViewById(R.id.delete_no);

yes.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
notesViewModel.deleteNote(sid);
finish();
}
});

no.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
sheetDialog.dismiss();
}
});

sheetDialog.show();
}
return true;
}
}

-Lớp NotesAdapter
package com.trodev.myethicnotes.adapter;

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.trodev.myethicnotes.Model.Notes;
import com.trodev.myethicnotes.R;
import com.trodev.myethicnotes.activities.MainActivity;
import com.trodev.myethicnotes.activities.UpdateNoteActivity;

import java.util.ArrayList;
import java.util.List;

public class NotesAdapter extends


RecyclerView.Adapter<NotesAdapter.notesViewholder> {
MainActivity mainActivity;
List<Notes> notes;
List<Notes> allNotesItem;
public NotesAdapter(MainActivity mainActivity, List<Notes> notes) {
this.mainActivity = mainActivity;
this.notes = notes;
allNotesItem = new ArrayList<>(notes);
}

public void searchNotes(List<Notes> filterName){


this.notes = filterName;
notifyDataSetChanged();
}

@NonNull
@Override
public notesViewholder onCreateViewHolder(@NonNull ViewGroup parent, int
viewType) {
return new
notesViewholder(LayoutInflater.from(mainActivity).inflate(R.layout.item_notes,
parent, false));
}

@Override
public void onBindViewHolder(@NonNull notesViewholder holder, int
position) {

Notes note = notes.get(position);

if (note.notesPriority.equals("1")) {

holder.notesPriority.setBackgroundResource(R.drawable.green_shape);
} else if (note.notesPriority.equals("2")) {

holder.notesPriority.setBackgroundResource(R.drawable.yellow_shape);
} else if (note.notesPriority.equals("3")) {
holder.notesPriority.setBackgroundResource(R.drawable.red_shape);
}
holder.noteTitle.setText(note.notesTitle);
holder.noteSubtitle.setText(note.notesSubTitle);
holder.noteDate.setText(note.notesDate);

// send data another activity....


holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(mainActivity,
UpdateNoteActivity.class);
intent.putExtra("id", note.id);
intent.putExtra("title", note.notesTitle);
intent.putExtra("subtitle", note.notesSubTitle);
intent.putExtra("notes", note.notes);
intent.putExtra("priority", note.notesPriority);
mainActivity.startActivity(intent);
}
});
}

@Override
public int getItemCount() {
return notes.size();
}

public class notesViewholder extends RecyclerView.ViewHolder {

View notesPriority;
TextView noteTitle, noteSubtitle, noteDate;
public notesViewholder(@NonNull View itemView) {
super(itemView);
noteTitle = itemView.findViewById(R.id.notesTitle);
noteSubtitle = itemView.findViewById(R.id.noteSubtitle);
noteDate = itemView.findViewById(R.id.notesDate);
notesPriority = itemView.findViewById(R.id.notesPriority);
}
}
}
Trong adapter NotesAdapter, nhiệm vụ chính là hiển thị danh sách các ghi chú trong
RecyclerView . Dưới đây là giải thích về mã này:

1. Constructor và Dữ liệu: Adapter nhận một danh sách các đối tượng Notes và hoạt động
chính là hiển thị chúng trong RecyclerView. Adapter cũng nhận tham chiếu tới hoạt động
MainActivity.
2. Phương thức onCreateViewHolder(): Trong phương thức này, layout của mỗi item trong
RecyclerView được inflate từ tệp item_notes.xml, và được trả về dưới dạng một đối tượng
notesViewholder .
3. Phương thức onBindViewHolder() : Trong phương thức này, dữ liệu từ mỗi đối tượng
Notes trong danh sách được hiển thị trong RecyclerView . Các thông tin như tiêu đề, phụ
đề, ngày và mức độ ưu tiên được hiển thị trên các TextView. Màu nền của TextView hiển
thị mức độ ưu tiên được thiết lập dựa trên giá trị của notesPriority.
4. Xử lý sự kiện click: Khi người dùng click vào một item trong danh sách, một Intent
được tạo để chuyển đến UpdateNoteActivity, và dữ liệu về ghi chú tương ứng được chuyển
đi qua Intent để cập nhật.
5. Phương thức getItemCount(): Trả về số lượng các item trong danh sách ghi chú.
6. Class notesViewholder: Định nghĩa một lớp nội tuyến để đại diện cho mỗi viewholder
trong RecyclerView. Các thành phần giao diện như tiêu đề, phụ đề, ngày và mức độ ưu
tiên của ghi chú được tham chiếu và cập nhật trong lớp này.

Tóm lại, NotesAdapter là một adapter dùng để hiển thị danh sách các ghi chú trong RecyclerView,
và cung cấp chức năng click để chuyển đến màn hình cập nhật ghi chú khi người dùng click vào
một ghi chú.

II Giao diện Layout

\
1. Đây là giao diện thêm note
- EditText gồm Title và Subtitle để viết lại tiêu đề và tiêu đề con cho
notes.
- Textview Low,Medium,High để có thể đánh dấu mức độ quan trọng
của notes mà người sử dụng muốn lưu ý.
- EditText notesData để viết nội dung chính mà note này cần nhập.
2. Giao diện chính khi xuất hiện
- Có header là tên của chương trình
- TextView :
+ No Filter : để hiển thị các note một cách bình thường và không có sự sắp xếp.
+ High to Low: sắp xếp mức độ quan trọng của note theo thứ tự từ cao đến thấp.
+ Low to High : sắp xếp mức độ quan trọng của note theo thứ tự từ thấp đến cao.
- RecycleView : để hiện thị một danh sách các note
- FloatingActionButton: để khi nhấn vào sẽ xuất hiện ra một activity mới để có thể
thêm được các note mới.
3. Giao diện sau khi lưu một notes thành công
- Icon của FloatingActionButton từ dấu cộng thành hình điện thoại lưu xuống.
£

4. Giao diện khi muốn xoá một notes


- Chức năng là đưa ra một activity có thông báo là Yes or No
+ Nếu chọn Yes: thì notes đó sẽ được xoá.
+ Nếu chọn No: thì notes được chọn sẽ không bị xoá.
5. Giao diện của một note sau khi được tạo sẽ hiển thị ở màn hình chính.
6. Giao diện xoá note
7.Giao diện menu với 4 chức năng
- Notification: các thông báo
- Privacy Policy: quy định của app
- Share Apps: Chia sẻ app
- Rating Us: đánh giá app
7. Giao diện tìm kiếm
- Chức năng để tìm kiếm

You might also like