亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

Android實現記事本小功能

瀏覽:2日期:2022-09-23 11:02:29

本文實例為大家分享了Android實現記事本功能的具體代碼,供大家參考,具體內容如下

首先聲明,本人是android的小白,主要是新人項目寫了這個程序,思路可能不是很清晰,可優化的地方也有很多,望路過的大佬不吝賜教。該記事本包含創建新條目,數據庫增刪改查,條目可編輯,滑動刪除與拖拽排序,簡單鬧鐘實現(還有個簡陋背景音樂開關就不提了太簡單),接下來逐一介紹一下。

build.gradle導入

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數據庫

room數據庫相比于sqlite來說對新人確實友好很多,在沒有SQL基礎的前提下,增刪改查等實現都很簡單,只需創建一個實例,便可在線程中進行。具體代碼為

①接口:

@Daointerface 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() { //設置滑動類型標記 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 } //拖拽回調 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) } //狀態回調 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接口實現

拖拽排序和滑動刪除后即更新一次,這種方法并不好,畢竟沒有用到MVVM中的高級組件,包括觀察者,Livedata,ViewModel察覺數據變化并提示更新。建議在這種方法的前提下可以考慮在從Activity離開后,再數據更新。注:千萬不要在**onPause()**中涉及數據更新和保存!!!

//拖拽排序 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) } } //排序后的數據更新 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) }

簡易鬧鐘實現

broadcast類需要自己實現

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

這里只是發個廣播通知,并沒有提示聲音,可以采取發到通知欄的方式,系統會有提示音。涉及到AlarmManager類NoteActivity中的實現:

setBtn.setOnClickListener { view -> val c = Calendar.getInstance() //調整為中國時區,不然有8小時差比較麻煩 val tz = TimeZone.getTimeZone('Asia/Shanghai') c.timeZone = tz //獲取當前時間 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);//秒 } //計時發送通知 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, '設置成功', Toast.LENGTH_SHORT).show() } }

其它方面如點擊recyclerView中的Item重新編輯時對原數據的展現,用到了setText(),這里注意不要跟kotlin中setText()和getText()搞混。

大概所有功能差不多就這些了,畢竟只是個記事本應用。所有代碼放在github上面了,如有需要,請自取

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Android
相關文章:
主站蜘蛛池模板: 真人毛片免费拍拍拍aa视频 | jizz国产精品免费麻豆 | 美国老黑一级毛片免费的大黄 | 深夜免费看片 | 国产精品高清久久久久久久 | 日韩免费观看 | 岛国精品成人 | 亚洲va欧美va国产 | 亚洲国产精品免费在线观看 | 久久狠狠干 | 精品国产3p一区二区三区 | 色婷婷一区二区三区四区成人 | 国产精品卡哇伊小可爱在线观看 | riav久久中文一区二区 | 手机看片日韩日韩国产在线看 | 国内自拍 在线播放 网红 | 国产大学生一级毛片绿象 | 国产在线观看一区二区三区 | 色婷婷久久| 国产日韩欧美亚洲综合首页 | 亚洲在线观看一区二区 | xzl仙踪林一区 | 久久4k岛国高清一区二区 | 日韩一级a毛片欧美区 | 在线视频日韩 | 谁有免费的黄色网址 | 亚洲精品不卡午夜精品 | 亚洲精品乱码久久久久久蜜桃欧美 | 嫩草视频在线观看免费 | 99久久国语露脸精品国产 | 久久这里只有精品66re99 | 亚洲免费中字慕日产2021 | 风流慈禧一级毛片在线播放 | 一区二区三区www | 亚洲最大的黄色网址 | 亚洲成年人影院 | 视频在线观看黄 | 欧美色图影院 | 国产精品视屏 | 国产在线精品二区韩国演艺界 | 日韩在线观看一区二区不卡视频 |