Skip to content

Instantly share code, notes, and snippets.

@amoozeshbebin
Created December 4, 2023 11:13
Show Gist options
  • Save amoozeshbebin/15d0e117f3f65a58097d22121a9e7263 to your computer and use it in GitHub Desktop.
Save amoozeshbebin/15d0e117f3f65a58097d22121a9e7263 to your computer and use it in GitHub Desktop.
app1
MainActivity.kt:
package com.iliyadev.todo2
import android.annotation.SuppressLint
import android.content.Intent
import android.os.Bundle
import android.widget.ListView
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.floatingactionbutton.FloatingActionButton
class MainActivity : AppCompatActivity() {
private lateinit var todoViewModel: ToDoViewModel
private lateinit var todoAdapter: ToDoAdapter
@SuppressLint("NotifyDataSetChanged")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val recyclerView = findViewById<RecyclerView>(R.id.recyclerView)
val layoutManager = LinearLayoutManager(this)
val todoList = listOf(
ToDoItem("Title 1", "Description 1"),
ToDoItem("Title 2", "Description 2"),
// Add more items as needed
)
todoAdapter = ToDoAdapter(todoList)
recyclerView.layoutManager = layoutManager
recyclerView.adapter = todoAdapter
todoViewModel = ViewModelProvider(this)[ToDoViewModel::class.java]
todoViewModel.todos.observe(this) { todos ->
todoAdapter.todoList = todos
todoAdapter.notifyDataSetChanged()
}
val fab = findViewById<FloatingActionButton>(R.id.fab)
fab.setOnClickListener {
val intent = Intent(this@MainActivity, AddToDoActivity::class.java)
startActivity(intent)
}
}
}
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
AppDatabase.kt:
package com.iliyadev.todo2
import androidx.room.Database
import androidx.room.RoomDatabase
@Database(entities = [ToDo::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun todoDao(): ToDoDao
}
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
AddToDoActivity.kt:
package com.iliyadev.todo2
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.ViewModelProvider
class AddToDoActivity : AppCompatActivity() {
private lateinit var todoViewModel: ToDoViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_add_todo)
val editTextTitle = findViewById<EditText>(R.id.editTextTitle)
val editTextDescription = findViewById<EditText>(R.id.editTextDescription)
val buttonAddToDo = findViewById<Button>(R.id.buttonAddToDo)
todoViewModel = ViewModelProvider(this).get(ToDoViewModel::class.java)
buttonAddToDo.setOnClickListener {
val title = editTextTitle.text.toString()
val description = editTextDescription.text.toString()
if (title.isNotEmpty() && description.isNotEmpty()) {
val todo = ToDo(0, title, description)
todoViewModel.insert(todo)
finish()
}
}
}
}
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
ToDo.kt:
package com.iliyadev.todo2
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "todo")
data class ToDo(
@PrimaryKey(autoGenerate = true)
val id: Long,
val title: String,
val description: String,
val isCompleted: Boolean = false
)
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
ToDoAdapter.kt:
package com.iliyadev.todo2
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
class ToDoAdapter(var todoList: List<ToDoItem>) : RecyclerView.Adapter<ToDoViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ToDoViewHolder {
val itemView = LayoutInflater.from(parent.context)
.inflate(R.layout.list_item_todo, parent, false)
return ToDoViewHolder(itemView)
}
override fun onBindViewHolder(holder: ToDoViewHolder, position: Int) {
val todoItem = todoList[position]
holder.textViewTitle.text = todoItem.title
holder.textViewDescription.text = todoItem.description
}
override fun getItemCount(): Int {
return todoList.size
}
}
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
ToDoDao.kt:
package com.iliyadev.todo2
import androidx.room.Dao
import androidx.room.Insert
import androidx.room.Query
@Dao
interface ToDoDao {
@Insert
suspend fun insert(todo: ToDo)
@Query("SELECT * FROM todo")
suspend fun getAll(): List<ToDo>
@Query("SELECT * FROM todo")
suspend fun getAllToDos(): List<ToDo>
@Query("UPDATE todo SET isCompleted = :isComplete WHERE id = :id")
suspend fun updateToDoStatus(id: Long, isComplete: Boolean)
}
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
ToDoItem.kt:
package com.iliyadev.todo2
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.CheckBox
import android.widget.TextView
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
class ToDoItem(val title: String, val description: String){
val todoList = listOf(
ToDoItem("Title 1", "Description 1"),
ToDoItem("Title 2", "Description 2"),
// Add more items as needed
)
}
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
ToDoRepository.kt:
package com.iliyadev.todo2
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
abstract class ToDoRepository(private val toDoDao: ToDoDao) {
suspend fun insertToDo(toDo: ToDo) {
toDoDao.insert(toDo)
}
abstract suspend fun getAllToDos(): List<ToDo>
abstract suspend fun updateToDoStatus(id: Long, isComplete: Boolean)
}
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
ToDoViewHolder.kt:
package com.iliyadev.todo2
import android.view.View
import android.widget.CheckBox
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
class ToDoViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val checkBoxTodo: CheckBox = itemView.findViewById(R.id.checkBoxTodo)
val textViewTitle: TextView = itemView.findViewById(R.id.textViewTitle)
val textViewDescription: TextView = itemView.findViewById(R.id.textViewDescription)
}
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
ToDoViewModel.kt:
package com.iliyadev.todo2
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
class ToDoViewModel(private val todoDao: ToDoDao) : ViewModel() {
private val _todos = MutableLiveData<List<ToDoItem>>()
val todos: LiveData<List<ToDoItem>>
get() = _todos
val todos1 = runBlocking {
todoDao.getAllToDos()
}
fun insert(todo: ToDo) {
viewModelScope.launch(Dispatchers.IO) {
todoDao.insert(todo)
}
}
suspend fun updateToDoStatus(id: Long, isComplete: Boolean) {
viewModelScope.launch(Dispatchers.IO) {
todoDao.updateToDoStatus(id, isComplete)
}
}
}
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
Activity_add_todo.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/editTextTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Title" />
<EditText
android:id="@+id/editTextDescription"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Description"
android:minHeight="48dp" />
<Button
android:id="@+id/buttonAddToDo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Add ToDo" />
</LinearLayout>
Activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:layout_marginBottom="16dp"
android:src="@drawable/baseline_add_24"
tools:ignore="SpeakableTextPresentCheck" />
</RelativeLayout>
➖➖➖➖ ➖➖➖➖ ➖➖➖➖ ➖➖➖➖ ➖➖➖➖ ➖➖➖➖ ➖➖➖➖ ➖➖➖➖ ➖➖➖➖ ➖➖➖➖ ➖➖➖➖
list_item_todo.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="16dp">
<CheckBox
android:id="@+id/checkBoxTodo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_gravity="center_vertical"/>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:layout_marginStart="16dp">
<TextView
android:id="@+id/textViewTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:textAppearanceMedium"/>
<TextView
android:id="@+id/textViewDescription"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:textAppearanceSmall"
android:layout_marginTop="4dp"/>
</LinearLayout>
</LinearLayout>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment