日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Android實(shí)現(xiàn)記事本小功能

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

本文實(shí)例為大家分享了Android實(shí)現(xiàn)記事本功能的具體代碼,供大家參考,具體內(nèi)容如下

首先聲明,本人是android的小白,主要是新人項(xiàng)目寫(xiě)了這個(gè)程序,思路可能不是很清晰,可優(yōu)化的地方也有很多,望路過(guò)的大佬不吝賜教。該記事本包含創(chuàng)建新條目,數(shù)據(jù)庫(kù)增刪改查,條目可編輯,滑動(dòng)刪除與拖拽排序,簡(jiǎn)單鬧鐘實(shí)現(xiàn)(還有個(gè)簡(jiǎn)陋背景音樂(lè)開(kāi)關(guān)就不提了太簡(jiǎn)單),接下來(lái)逐一介紹一下。

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'

沒(méi)什么多說(shuō)的。

Room數(shù)據(jù)庫(kù)

room數(shù)據(jù)庫(kù)相比于sqlite來(lái)說(shuō)對(duì)新人確實(shí)友好很多,在沒(méi)有SQL基礎(chǔ)的前提下,增刪改查等實(shí)現(xiàn)都很簡(jiǎn)單,只需創(chuàng)建一個(gè)實(shí)例,便可在線程中進(jìn)行。具體代碼為

①接口:

@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類(獲取實(shí)例

@Database(version = 1, entities = [Note::class])abstract class AppDatabase: RoomDatabase(){ abstract fun noteDao() : NoteDao companion object{ //訪問(wèn)實(shí)例 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 } } }}

滑動(dòng)刪除和拖拽排序

class RecycleItemTouchHelper(private val helperCallback: ItemTouchHelperCallback) : ItemTouchHelper.Callback() { //設(shè)置滑動(dòng)類型標(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 } //滑動(dòng) 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 } //滑動(dòng) 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接口實(shí)現(xiàn)

拖拽排序和滑動(dòng)刪除后即更新一次,這種方法并不好,畢竟沒(méi)有用到MVVM中的高級(jí)組件,包括觀察者,Livedata,ViewModel察覺(jué)數(shù)據(jù)變化并提示更新。建議在這種方法的前提下可以考慮在從Activity離開(kāi)后,再數(shù)據(jù)更新。注:千萬(wàn)不要在**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) }

簡(jiǎn)易鬧鐘實(shí)現(xiàn)

broadcast類需要自己實(shí)現(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ā)個(gè)廣播通知,并沒(méi)有提示聲音,可以采取發(fā)到通知欄的方式,系統(tǒng)會(huì)有提示音。涉及到AlarmManager類NoteActivity中的實(shí)現(xiàn):

setBtn.setOnClickListener { view -> val c = Calendar.getInstance() //調(diào)整為中國(guó)時(shí)區(qū),不然有8小時(shí)差比較麻煩 val tz = TimeZone.getTimeZone('Asia/Shanghai') c.timeZone = tz //獲取當(dāng)前時(shí)間 if (setHour.text.toString()!=''&&setMin.text.toString()!='') { c.set(Calendar.HOUR_OF_DAY, setHour.text.toString().toInt());//小時(shí) c.set( Calendar.MINUTE, setMin.text.toString().toInt() );//分鐘 c.set(Calendar.SECOND, 0);//秒 } //計(jì)時(shí)發(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, '請(qǐng)輸入正確的時(shí)間格式!', 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() } }

其它方面如點(diǎn)擊recyclerView中的Item重新編輯時(shí)對(duì)原數(shù)據(jù)的展現(xiàn),用到了setText(),這里注意不要跟kotlin中setText()和getText()搞混。

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Android
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日本va欧美va精品发布| 欧美日韩一区二区综合| 久久最新视频| 久久成人国产| 亚洲精品成人一区| 日本在线成人| 欧美中文高清| 日韩精品久久理论片| 蜜桃久久av一区| 日韩精品亚洲专区| 日本麻豆一区二区三区视频| 亚洲人成精品久久久| 日韩中文字幕无砖| 91精品国产自产精品男人的天堂| 欧美日韩亚洲一区在线观看| 国产精品一站二站| 国产成人77亚洲精品www| 日韩电影二区| 尤物tv在线精品| 中文不卡在线| 国产精品入口久久| 日韩深夜视频| 999精品色在线播放| 欧美理论视频| 亚洲一级淫片| 欧美aa在线视频| 天堂√中文最新版在线| 激情视频一区二区三区| 免费久久99精品国产| 欧美片第1页综合| 免费在线日韩av| 久久男人av资源站| 伊人久久成人| 青青伊人久久| 日韩欧美一区二区三区免费看| 婷婷亚洲五月| 日韩一区中文| 欧美a在线观看| 久久亚洲国产| 亚洲三级av| 国产一区二区三区四区五区传媒| 久久九九精品| 日本不卡高清| 成人啊v在线| 视频一区二区不卡| 精品久久一区| 久久国产精品久久久久久电车 | 成人亚洲精品| 91精品国产91久久久久久黑人| 日韩午夜av| 国产精品黄网站| 免费黄色成人| 国产日韩在线观看视频| 国产精品99视频| 宅男噜噜噜66国产日韩在线观看| 91精品一区| 精品欧美激情在线观看| 国产精品大片| 另类亚洲自拍| 亚洲精品福利电影| 日本在线一区二区三区| 九九色在线视频| 日韩中文字幕| 久久中文亚洲字幕| 国产精品久av福利在线观看| 日韩一级欧洲| а√天堂中文在线资源8| 日韩中文字幕一区二区高清99| 电影天堂国产精品| 国产午夜精品一区在线观看| 黄色精品网站| 国产suv精品一区| 亚洲va久久久噜噜噜久久| 日韩国产欧美| 久久精品国内一区二区三区| 亚洲精品一级| 尤物在线精品| 久久激情中文| 免费精品一区| 日韩视频1区| 欧美日韩视频| 九色porny丨国产首页在线| 国产欧美日韩一区二区三区在线| av不卡免费看| 日韩av福利| 久久精品一本| 国产日产一区| 亚洲理论在线| 不卡一区综合视频| 热三久草你在线| 成人污污视频| 国产劲爆久久| 日本久久二区| 视频一区中文字幕国产| 久久国产亚洲精品| 久久精品国产www456c0m| 欧美激情另类| 精品国产麻豆| 麻豆精品蜜桃视频网站| 日本aⅴ精品一区二区三区| 久久国产精品99国产| 1024精品久久久久久久久| 日韩精品欧美激情一区二区| 国内一区二区三区| 麻豆免费精品视频| 久久激情五月婷婷| 青草国产精品| 日韩精品视频网| 日韩在线网址| 视频一区欧美日韩| 性欧美长视频| 中文亚洲免费| 国产偷自视频区视频一区二区| 亚洲二区精品| 免费成人网www| 欧美理论视频| 午夜视频精品| 久久国产精品久久w女人spa| 国产精品社区| 免费日韩av片| 亚洲一区二区免费在线观看| 亚洲精品人人| 欧美亚洲免费| 国产免费播放一区二区| 日韩av午夜在线观看| 国产欧美视频在线| 久久成人高清| 成人在线黄色| 日本少妇一区| 亚洲午夜91| 国产亚洲精品v| 亚洲精品高潮| 国产精品日本一区二区三区在线| 久久久久伊人| 美女福利一区二区三区| 四虎4545www国产精品 | 一区二区精品| 日韩精品视频网站| 欧美国产日本| 日韩精品专区| 伊人久久亚洲热| 五月国产精品| 国产精品资源| 日韩成人a**站| 色88888久久久久久影院| 欧美成人亚洲| 亚洲tv在线| 麻豆91精品91久久久的内涵| 国产一区二区三区四区五区| 国产拍在线视频| 亚州av乱码久久精品蜜桃| 亚洲综合图色| 麻豆91在线播放| 激情六月综合| 亚洲精品乱码| 麻豆一区二区三| 久久精品官网| 亚洲免费观看高清完整版在线观| 久久国产精品色av免费看| 精品久久中文| 樱桃成人精品视频在线播放| 日韩成人午夜精品| 黑人精品一区| 亚洲一区日韩| 日本国产一区| 综合日韩av| 老牛国产精品一区的观看方式| 国产午夜久久av| 群体交乱之放荡娇妻一区二区| 亚洲欧美日韩国产一区二区| 国产精品亚洲四区在线观看| 日韩欧美网址| 亚洲精品大全| 色婷婷综合网| 亚洲视频二区| 国产不卡人人| 亚洲午夜免费| 91麻豆国产自产在线观看亚洲| 欧美综合国产| 欧美一级二区| 亚洲午夜黄色| 久久国产三级精品| 91精品推荐| 国产精品欧美日韩一区| 亚洲午夜精品久久久久久app| 91p九色成人| 1024精品一区二区三区| 欧美日韩一区二区三区不卡视频| 999国产精品999久久久久久| 欧美一级二级三级视频| 亚洲午夜视频| 欧美激情综合| 亚洲三级在线| 激情欧美丁香| 国产精品亚洲产品| 国产视频欧美| 青青青免费在线视频| 欧美日韩va| 亚洲神马久久| av一区在线|