Android实现记事本小功能
本文实例为大家分享了Android实现记事本功能的具体代码,供大家参考,具体内容如下
首先声明,本人是android的小白,主要是新人项目写了这个程序,思路可能不是很清晰,可优化的地方也有很多,望路过的大佬不吝赐教。
该记事本包含创建新条目,数据库增删改查,条目可编辑,滑动删除与拖拽排序,简单闹钟实现(还有个简陋背景音乐开关就不提了太简单),接下来逐一介绍一下。
build.gradle导入
applyplugin:'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基础的前提下,增删改查等实现都很简单,只需创建一个实例,便可在线程中进行。具体代码为
①接口:
@Dao interfaceNoteDao{ @Update funupdateNote(newNote:Note) @Query("select*fromNote") funloadAllNotes():List@Query("select*fromNotewheretitle>:title") funloadNotesLongerThan(title:String):List @Query("select*fromNotewhereid==:id") funloadById(id:Long):Note @Delete fundeleteNote(note:Note) @Query("deletefromNotewheretitle==:title") fundeleteNoteByTitle(title:String):Int @Insert funinsertNote(note:Note) }
②Appdatabase类(获取实例
@Database(version=1,entities=[Note::class]) abstractclassAppDatabase:RoomDatabase(){ abstractfunnoteDao():NoteDao companionobject{ //访问实例 privatevarinstance:AppDatabase?=null @Synchronized//同步化 fungetDatabase(context:Context):AppDatabase{ instance?.let{ returnit } returnRoom.databaseBuilder(context.applicationContext, AppDatabase::class.java,"app_database") .build().apply{ instance=this } } } }
滑动删除和拖拽排序
classRecycleItemTouchHelper(privatevalhelperCallback:ItemTouchHelperCallback): ItemTouchHelper.Callback(){ //设置滑动类型标记 overridefungetMovementFlags( recyclerView:RecyclerView, viewHolder:RecyclerView.ViewHolder ):Int{ returnmakeMovementFlags(ItemTouchHelper.UPorItemTouchHelper.DOWN, ItemTouchHelper.ENDorItemTouchHelper.START) } overridefunisLongPressDragEnabled():Boolean{ returntrue } //滑动 overridefunisItemViewSwipeEnabled():Boolean{ returntrue } //拖拽回调 overridefunonMove( recyclerView:RecyclerView, viewHolder:RecyclerView.ViewHolder, target:RecyclerView.ViewHolder ):Boolean{ helperCallback.onMove(viewHolder.adapterPosition,target.adapterPosition) returntrue } //滑动 overridefunonSwiped(viewHolder:RecyclerView.ViewHolder,direction:Int):Unit{ helperCallback.onItemDelete(viewHolder.adapterPosition) } //状态回调 overridefunonSelectedChanged( viewHolder:RecyclerView.ViewHolder?, actionState:Int ){ super.onSelectedChanged(viewHolder,actionState) } interfaceItemTouchHelperCallback{ funonItemDelete(positon:Int) funonMove(fromPosition:Int,toPosition:Int) } }
NoteAdapter接口实现
拖拽排序和滑动删除后即更新一次,这种方法并不好,毕竟没有用到MVVM中的高级组件,包括观察者,Livedata,ViewModel察觉数据变化并提示更新。建议在这种方法的前提下可以考虑在从Activity离开后,再数据更新。
注:千万不要在**onPause()**中涉及数据更新和保存!!!
//拖拽排序 overridefunonMove(fromPosition:Int,toPosition:Int){ valnoteDao=AppDatabase.getDatabase(context).noteDao() if(fromPosition"+toPosition) } }else{ for(iinfromPositiondownTotoPosition+1){ Collections.swap(noteList,i,i-1) } } //排序后的数据更新 thread{ vartemplist=noteDao.loadAllNotes().toMutableList() for(iin0untiltemplist.size){ templist[i].title=noteList[i].title templist[i].content=noteList[i].content noteDao.updateNote(templist[i]) } } notifyItemMoved(fromPosition,toPosition) }
简易闹钟实现
broadcast类需要自己实现
classMyReceiver:BroadcastReceiver(){ overridefunonReceive(context:Context,intent:Intent){ //ThismethodiscalledwhentheBroadcastReceiverisreceivinganIntentbroadcast. Toast.makeText(context,"Youhaveatasktodo!!!",Toast.LENGTH_LONG).show() } }
这里只是发个广播通知,并没有提示声音,可以采取发到通知栏的方式,系统会有提示音。涉及到AlarmManager类
NoteActivity中的实现:
setBtn.setOnClickListener{view-> valc=Calendar.getInstance() //调整为中国时区,不然有8小时差比较麻烦 valtz=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);//秒 } //计时发送通知 valmIntent=Intent(this,MyReceiver::class.java) valmPendingIntent= PendingIntent.getBroadcast(this,0,mIntent,PendingIntent.FLAG_UPDATE_CURRENT) am=this .getSystemService(Context.ALARM_SERVICE)asAlarmManager 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上面了,如有需要,请自取
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。