Created
December 4, 2023 11:13
-
-
Save amoozeshbebin/15d0e117f3f65a58097d22121a9e7263 to your computer and use it in GitHub Desktop.
app1
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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