- ProReadApp
Tên Dự Án: ProReadApp
Tác giả: Nguyễn Nam Hải
Mô tả: Đây là 1 app chạy local để mọi người có thể đọc các truyện mà mình đã tạo.
- Đọc truyện nhiều chương.
- Thêm, sửa truyện.
- Chia ra các mục: Mới nhất, Mới cập nhật, Đọc gần đây, Đã hoàn thành.
- Tính năng xem các truyện thuộc thể loại nào đó.
- Tìm kiếm truyện: Tìm kiếm theo tên truyện, tác giả.
- Dark/Night mode, sửa size của chữ khi đọc truyện.
- Ngôn ngữ lập trình và Môi trường:
- Dùng ngôn ngữ Java để viết app.
- Dùng Android Studio để làm IDE chính.
- UI và điều hướng:
- XML Layout: Thiết kế giao diện người dùng.
- BottomNavigationView: Thanh điều hướng ở dưới cùng cho các Fragment.
- Fragment + Navigation Component: Điều hướng giữa các màn hình (Home, Thể loại, Tìm kiếm, Setting).
- Cơ sở dữ liệu:
- Room Database: Lưu trữ dữ liệu truyện, chương, thể loại cục bộ trên thiết bị.
- LiveData + ViewModel: Hỗ trợ cập nhật dữ liệu UI tự động khi thay đổi.
| AndroidManifest.xml
| main.iml
|
+---java
| \---com
| \---example
| \---proreadapp
| +---adapter
| | CategoryAdapter.java
| | ChapterAdapter.java
| | ChapterListAdapter.java
| | MultiSelectionAdapter.java
| | SearchAdapter.java
| | StoryAdapter.java
| |
| +---dao
| | CategoryDao.java
| | ChapterDao.java
| | StoryCategoryDao.java
| | StoryDao.java
| |
| +---database
| | AppDatabase.java
| | StoryDatabase.java
| |
| +---model
| | Category.java
| | CategoryWithStories.java
| | Chapter.java
| | SearchItem.java
| | Story.java
| | StoryCategoryCrossRef.java
| | StoryWithCategories.java
| | StoryWithChapters.java
| |
| +---repository
| | CategoryRepository.java
| | ChapterRepository.java
| | SearchRepository.java
| | StoryRepository.java
| |
| +---view
| | | ChapterAddEditActivity.java
| | | ChapterReaderActivity.java
| | | MainActivity.java
| | | ShowListActivity.java
| | | StoryAddEditActivity.java
| | | StoryDetailActivity.java
| | | StoryEditActivity.java
| | | StoryListEditActivity.java
| | |
| | \---fragment
| | HomeFragment.java
| | SettingFragment.java
| | TheLoaiFragment.java
| | TimKiemFragment.java
| |
| \---viewmodel
| CategoryViewModel.java
| ChapterEditLauncher.java
| ChapterViewModel.java
| HomeViewModel.java
| HomeViewModelFactory.java
| ReaderSettingViewModel.java
| SearchViewModel.java
| SearchViewModelFactory.java
| ShowListViewModel.java
| StoryDetailViewModel.java
| StoryEditViewModel.java
| StoryViewModel.java
|
\---res
+---color
| bottom_nav_color_selector.xml
|
+---drawable
| | bg_description_rounded.xml
| | bg_image_rounded.xml
| | bg_layout_oval.xml
| | bg_layout_oval_xam.xml
| | button_rounded_pink.xml
| | error_book.xml
| | eye_svgrepo_com.xml
| | ic_arrow_right.xml
| | ic_edit.xml
| | ic_home.xml
| | ic_image_placeholder.xml
| | ic_launcher_background.xml
| | ic_launcher_foreground.xml
| | ic_offline.xml
| | ic_setting.xml
| | ic_theloai.xml
| | ic_timkiem.xml
| | love_svgrepo_com.xml
| | mucthanky.jpg
| | mucthanky1618392290.jpg
| | placeholder_book.xml
| | sample_cover_1.xml
| | sample_cover_2.xml
| | textview_border.xml
| | trending_up_svgrepo_com.xml
| |
| \---menu
+---layout
| | activity_chapter_add_edit.xml
| | activity_main.xml
| | activity_show_list.xml
| | activity_story_add_edit.xml
| | activity_story_detail.xml
| | activity_story_edit.xml
| | activity_story_list_edit.xml
| | dialog_add_category.xml
| | dialog_font_settings.xml
| | doc_truyen_xml.xml
| | fragment_home.xml
| | fragment_offline.xml
| | fragment_setting.xml
| | fragment_the_loai.xml
| | fragment_tim_kiem.xml
| | item_category.xml
| | item_category_selectable.xml
| | item_chapter.xml
| | item_search_result.xml
| | item_story.xml
| |
| \---fragment
+---menu
| bottom_nav_menu.xml
|
+---mipmap-anydpi-v26
| ic_launcher.xml
| ic_launcher_round.xml
|
+---mipmap-hdpi
| ic_launcher.webp
| ic_launcher_round.webp
|
+---mipmap-mdpi
| ic_launcher.webp
| ic_launcher_round.webp
|
+---mipmap-xhdpi
| ic_launcher.webp
| ic_launcher_round.webp
|
+---mipmap-xxhdpi
| ic_launcher.webp
| ic_launcher_round.webp
|
+---mipmap-xxxhdpi
| ic_launcher.webp
| ic_launcher_round.webp
|
+---navigation
| nav_graph.xml
|
+---values
| colors.xml
| strings.xml
| style.xml
| themes.xml
|
+---values-night
| colors.xml
| themes.xml
|
+---values-v26
| style.xml
|
\---xml
backup_rules.xml
data_extraction_rules.xmlMô tả: Khi tìm kiếm truyện trong TimKiemFragment, click vào item không chuyển sang StoryDetailActivity.
Giải Quyết: Cài đặt OnItemClickListener trong SearchAdapter, truyền storyId qua Intent để mở chi tiết truyện.
Kết Quả: Người dùng có thể click vào truyện tìm được và xem chi tiết ngay, đảm bảo luồng truy cập trực quan.
Mô tả: Sau khi thêm truyện mới trong StoryAddEditActivity, khi quay lại HomeFragment, danh sách không tự cập nhật.
Giải Quyết: Truyền LiveData qua ViewModel. Sử dụng Room kết hợp LiveData<List<Story>> để tự động cập nhật khi dữ liệu thay đổi.
Kết Quả: Dữ liệu hiển thị trong RecyclerView được cập nhật tự động, không cần gọi lại thủ công. UX tốt hơn, tránh lỗi đồng bộ.
Kết quả đạt được: Hiểu rõ hơn về cách hoạt động của các mô hình, cách truyền dữ liệu, làm việc với cơ sở dữ liệu. Tối ưu việc truyền qua lại.
Hướng phát triển tiếp theo: Sửa lại các bug và cập nhật lên việc sử dụng các database như Firestore, ... để có thể cập nhật dữ liệu từ server, khi ấy có thể có nhiều người dùng hơn. Song song với đó thì vẫn cần việc chạy local để khi người dùng không có mạng thì vẫn có thể đọc được các truyện đã tải từ trước.















