Android實現(xiàn)記事本小功能
本文實例為大家分享了Android實現(xiàn)記事本功能的具體代碼,供大家參考,具體內(nèi)容如下
首先聲明,本人是android的小白,主要是新人項目寫了這個程序,思路可能不是很清晰,可優(yōu)化的地方也有很多,望路過的大佬不吝賜教。
該記事本包含創(chuàng)建新條目,數(shù)據(jù)庫增刪改查,條目可編輯,滑動刪除與拖拽排序,簡單鬧鐘實現(xiàn)(還有個簡陋背景音樂開關(guān)就不提了太簡單),接下來逐一介紹一下。
build.gradle導(dǎo)入
apply plugin: 'kotlin-kapt' ''' implementation 'com.google.android.material:material:1.0.0' implementation 'de.hdodenhof:circleimageview:3.0.1' implementation 'com.android.support.constraint:constraint-layout:1.1.3' implementation 'androidx.room:room-runtime:2.1.0' implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0' implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.2.0' implementation 'androidx.recyclerview:recyclerview:1.0.0' kapt "androidx.room:room-compiler:2.1.0"
沒什么多說的。
Room數(shù)據(jù)庫
room數(shù)據(jù)庫相比于sqlite來說對新人確實友好很多,在沒有SQL基礎(chǔ)的前提下,增刪改查等實現(xiàn)都很簡單,只需創(chuàng)建一個實例,便可在線程中進行。具體代碼為
①接口:
@Dao interface NoteDao { @Update fun updateNote(newNote: Note) @Query("select * from Note") fun loadAllNotes(): List<Note> @Query("select * from Note where title > :title") fun loadNotesLongerThan(title:String) : List<Note> @Query("select * from Note where id == :id") fun loadById(id:Long) :Note @Delete fun deleteNote(note: Note) @Query("delete from Note where title == :title") fun deleteNoteByTitle(title: String): Int @Insert fun insertNote(note: Note) }
②Appdatabase類(獲取實例
@Database(version = 1, entities = [Note::class]) abstract class AppDatabase: RoomDatabase(){ abstract fun noteDao() : NoteDao companion object{ //訪問實例 private var instance : AppDatabase? = null @Synchronized//同步化 fun getDatabase(context: Context):AppDatabase{ instance?.let { return it } return Room.databaseBuilder(context.applicationContext, AppDatabase::class.java, "app_database") .build().apply { instance = this } } } }
滑動刪除和拖拽排序
class RecycleItemTouchHelper(private val helperCallback: ItemTouchHelperCallback) : ItemTouchHelper.Callback() { //設(shè)置滑動類型標(biāo)記 override fun getMovementFlags( recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder ): Int { return makeMovementFlags(ItemTouchHelper.UP or ItemTouchHelper.DOWN, ItemTouchHelper.END or ItemTouchHelper.START ) } override fun isLongPressDragEnabled(): Boolean { return true } //滑動 override fun isItemViewSwipeEnabled(): Boolean { return true } //拖拽回調(diào) override fun onMove( recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder ): Boolean { helperCallback.onMove(viewHolder.adapterPosition, target.adapterPosition) return true } //滑動 override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int): Unit { helperCallback.onItemDelete(viewHolder.adapterPosition) } //狀態(tài)回調(diào) override fun onSelectedChanged( viewHolder: RecyclerView.ViewHolder?, actionState: Int ) { super.onSelectedChanged(viewHolder, actionState) } interface ItemTouchHelperCallback { fun onItemDelete(positon: Int) fun onMove(fromPosition: Int, toPosition: Int) } }
NoteAdapter接口實現(xiàn)
拖拽排序和滑動刪除后即更新一次,這種方法并不好,畢竟沒有用到MVVM中的高級組件,包括觀察者,Livedata,ViewModel察覺數(shù)據(jù)變化并提示更新。建議在這種方法的前提下可以考慮在從Activity離開后,再數(shù)據(jù)更新。
注:千萬不要在**onPause()**中涉及數(shù)據(jù)更新和保存?。?!
//拖拽排序 override fun onMove(fromPosition: Int, toPosition: Int) { val noteDao = AppDatabase.getDatabase(context).noteDao() if (fromPosition < toPosition) { for (i in fromPosition until toPosition) { Collections.swap(noteList, i, i + 1) for (i in noteList){ Log.d("title", i.title) } Log.d("tag2", fromPosition.toString()+"->"+toPosition) } } else { for (i in fromPosition downTo toPosition + 1) { Collections.swap(noteList, i, i - 1) } } //排序后的數(shù)據(jù)更新 thread { var templist = noteDao.loadAllNotes().toMutableList() for (i in 0 until templist.size){ templist[i].title = noteList[i].title templist[i].content = noteList[i].content noteDao.updateNote(templist[i]) } } notifyItemMoved(fromPosition, toPosition) }
簡易鬧鐘實現(xiàn)
broadcast類需要自己實現(xiàn)
class MyReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { // This method is called when the BroadcastReceiver is receiving an Intent broadcast. Toast.makeText(context,"You have a task to do!!!", Toast.LENGTH_LONG).show() } }
這里只是發(fā)個廣播通知,并沒有提示聲音,可以采取發(fā)到通知欄的方式,系統(tǒng)會有提示音。涉及到AlarmManager類
NoteActivity中的實現(xiàn):
setBtn.setOnClickListener { view -> val c = Calendar.getInstance() //調(diào)整為中國時區(qū),不然有8小時差比較麻煩 val tz = TimeZone.getTimeZone("Asia/Shanghai") c.timeZone = tz //獲取當(dāng)前時間 if (setHour.text.toString()!=""&&setMin.text.toString()!="") { c.set(Calendar.HOUR_OF_DAY, setHour.text.toString().toInt());//小時 c.set( Calendar.MINUTE, setMin.text.toString().toInt() );//分鐘 c.set(Calendar.SECOND, 0);//秒 } //計時發(fā)送通知 val mIntent = Intent(this, MyReceiver::class.java) val mPendingIntent = PendingIntent.getBroadcast(this, 0, mIntent, PendingIntent.FLAG_UPDATE_CURRENT) am = this .getSystemService(Context.ALARM_SERVICE) as AlarmManager if (setHour.text.toString()==""||setMin.text.toString()==""|| setHour.text.toString().toInt() > 24 || setMin.text.toString().toInt() > 60) { Toast.makeText(this, "請輸入正確的時間格式!", Toast.LENGTH_SHORT).show() } else { Log.d("fuck10", c.timeInMillis.toString()) am!!.setExactAndAllowWhileIdle( AlarmManager.RTC_WAKEUP, c.timeInMillis, mPendingIntent ) Toast.makeText(this, "設(shè)置成功", Toast.LENGTH_SHORT).show() } }
其它方面如點擊recyclerView中的Item重新編輯時對原數(shù)據(jù)的展現(xiàn),用到了setText(),這里注意不要跟kotlin中setText()和getText()搞混。
大概所有功能差不多就這些了,畢竟只是個記事本應(yīng)用。
所有代碼放在github上面了,如有需要,請自取
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
android輸入框內(nèi)容改變的監(jiān)聽事件實例
下面小編就為大家分享一篇android輸入框內(nèi)容改變的監(jiān)聽事件實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-02-02Android開發(fā)進階自定義控件之滑動開關(guān)實現(xiàn)方法【附demo源碼下載】
這篇文章主要介紹了Android開發(fā)進階自定義控件之滑動開關(guān)實現(xiàn)方法,結(jié)合實例形式詳細分析了Android自定義開關(guān)控件的原理、實現(xiàn)步驟與相關(guān)操作技巧,需要的朋友可以參考下2016-08-08Android實現(xiàn)簡單的下拉阻尼效應(yīng)示例代碼
下面小編就為大家分享一篇Android實現(xiàn)簡單的下拉阻尼效應(yīng)示例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01Android Studio實現(xiàn)簡單音樂播放功能的示例代碼
這篇文章主要介紹了Android Studio實現(xiàn)簡單音樂播放功能的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Android+Flutter實現(xiàn)彩虹圖案的繪制
彩虹,是氣象中的一種光學(xué)現(xiàn)象,當(dāng)太陽光照射到半空中的水滴,光線被折射及反射,在天空上形成拱形的七彩光譜。接下來,我們就自己手動繪制一下彩虹圖案吧2022-11-11Android通過自定義Activity實現(xiàn)懸浮的Dialog詳解
這篇文章主要給大家介紹了關(guān)于Android通過自定義Activity實現(xiàn)懸浮的Dialog的相關(guān)資料,文中給出了詳細的示例代碼供大家參考學(xué)習(xí),對大家具有一定的參考學(xué)習(xí)價值,感興趣的朋友們下面來一起看看吧。2017-05-05一文詳解Android IntentService的開發(fā)技巧
Android應(yīng)用開發(fā)中,執(zhí)行后臺任務(wù)是常見需求之一,其中,IntentService是一種強大的工具,可以輕松管理異步任務(wù),而無需擔(dān)心線程管理和生命周期問題,本文將深入探討 IntentService 的各個方面,需要的朋友可以參考下2023-11-11