亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2020年07月22日 11:43:46   作者:bossshp  
這篇文章主要為大家詳細介紹了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 美食大轉(zhuǎn)盤詳解流程

    Android 美食大轉(zhuǎn)盤詳解流程

    今天為大家?guī)硪黄狝ndroid實例項目,美食大轉(zhuǎn)盤,當(dāng)你還在為明天吃什么而煩惱時,它將幫你做出最佳的選擇,美食大轉(zhuǎn)盤詳細流程來咯
    2021-11-11
  • Android 如何修改APK的默認名稱

    Android 如何修改APK的默認名稱

    這篇文章主要介紹了Android 如何修改APK的默認名稱的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • android輸入框內(nèi)容改變的監(jiān)聽事件實例

    android輸入框內(nèi)容改變的監(jiān)聽事件實例

    下面小編就為大家分享一篇android輸入框內(nèi)容改變的監(jiān)聽事件實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • Android開發(fā)進階自定義控件之滑動開關(guān)實現(xiàn)方法【附demo源碼下載】

    Android開發(fā)進階自定義控件之滑動開關(guān)實現(xiàn)方法【附demo源碼下載】

    這篇文章主要介紹了Android開發(fā)進階自定義控件之滑動開關(guān)實現(xiàn)方法,結(jié)合實例形式詳細分析了Android自定義開關(guān)控件的原理、實現(xiàn)步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2016-08-08
  • Android實現(xiàn)簡單的下拉阻尼效應(yīng)示例代碼

    Android實現(xiàn)簡單的下拉阻尼效應(yīng)示例代碼

    下面小編就為大家分享一篇Android實現(xiàn)簡單的下拉阻尼效應(yīng)示例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • 淺談Android Studio3.6 更新功能

    淺談Android Studio3.6 更新功能

    這篇文章主要介紹了Android Studio3.6 更新功能的相關(guān)知識,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • Android Studio實現(xiàn)簡單音樂播放功能的示例代碼

    Android Studio實現(xiàn)簡單音樂播放功能的示例代碼

    這篇文章主要介紹了Android Studio實現(xiàn)簡單音樂播放功能的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Android+Flutter實現(xiàn)彩虹圖案的繪制

    Android+Flutter實現(xiàn)彩虹圖案的繪制

    彩虹,是氣象中的一種光學(xué)現(xiàn)象,當(dāng)太陽光照射到半空中的水滴,光線被折射及反射,在天空上形成拱形的七彩光譜。接下來,我們就自己手動繪制一下彩虹圖案吧
    2022-11-11
  • Android通過自定義Activity實現(xiàn)懸浮的Dialog詳解

    Android通過自定義Activity實現(xiàn)懸浮的Dialog詳解

    這篇文章主要給大家介紹了關(guān)于Android通過自定義Activity實現(xiàn)懸浮的Dialog的相關(guān)資料,文中給出了詳細的示例代碼供大家參考學(xué)習(xí),對大家具有一定的參考學(xué)習(xí)價值,感興趣的朋友們下面來一起看看吧。
    2017-05-05
  • 一文詳解Android IntentService的開發(fā)技巧

    一文詳解Android IntentService的開發(fā)技巧

    Android應(yīng)用開發(fā)中,執(zhí)行后臺任務(wù)是常見需求之一,其中,IntentService是一種強大的工具,可以輕松管理異步任務(wù),而無需擔(dān)心線程管理和生命周期問題,本文將深入探討 IntentService 的各個方面,需要的朋友可以參考下
    2023-11-11

最新評論