기존에는 데이터를 미리넣어두고 그것을 recyclerview로 보여주는 로직이었습니다.
이번에는 editText로 입력값을 받고 그것을 저장한 다음 recyclerview 로 보여주는 형태를 만들어 보겠습니다.
입력값 --> Arraylist에 담기 --> recyclerview로 값 보여주기
data class TodoData(val list : String) {
}
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
tools:context=".Test3Fragment">
<!-- TODO: Update blank fragment layout -->
<TextView
android:id="@+id/todo_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/todo"
android:textColor="#E91E63"
android:textSize="50dp"
android:layout_margin="10dp"
android:textStyle="bold||italic"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/todo_back"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
android:layout_marginTop="30dp"
android:padding="20dp"
app:layout_constraintTop_toBottomOf="@id/todo_title"
android:orientation="horizontal">
<EditText
android:id="@+id/todo_input"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/todo_btn"
app:layout_constraintHorizontal_weight="4"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/todo_back" />
<Button
android:id="@+id/todo_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/btn_plus"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/todo_input"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintHorizontal_weight="1"
app:layout_constraintVertical_bias="0.125" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler"
android:layout_marginTop="20dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="20dp"
app:layout_constraintTop_toBottomOf="@id/todo_back"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
3.Test3Adapter 만들기
class Test3Adapter(private val items: ArrayList<TodoData>) : RecyclerView.Adapter<Test3Adapter.MyViewHolder>() {
inner class MyViewHolder(val binding : TodoItemBinding) : RecyclerView.ViewHolder(binding.root) {
fun bind(item : TodoData){
binding.todo = item
}
}
//리스트의 각 항목을 이루는 디자인(todo_item.xml) 연결
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Test3Adapter.MyViewHolder {
val inflater = LayoutInflater.from(parent.context)
val listItemBinding = TodoItemBinding.inflate(inflater, parent, false)
return MyViewHolder(listItemBinding)
}
//리스트의 각 항목에 들어갈 데이터를 지정
override fun onBindViewHolder(holder: Test3Adapter.MyViewHolder, position: Int) {
holder.bind(items[position])
}
override fun getItemCount(): Int {
return items.size
}
}
Test3Fragment
class Test3Fragment : Fragment() {
private lateinit var binding : FragmentTest3Binding //데이터 바인딩
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
@SuppressLint("SuspiciousIndentation")
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_test3, container, false)
** val todoData = arrayListOf<TodoData>()**
val adapter = Test3Adapter(todoData)
binding.recycler.adapter = adapter
binding.recycler.layoutManager = LinearLayoutManager(this.context)
binding.todoBtn.setOnClickListener {
val todo: String? = binding.todoInput.text.toString()
if(todo.isNullOrBlank()){
Log.d("list", "null값이다")
}else {
todoData.add(TodoData(todo))
adapter.notifyItemInserted(todoData.size-1)
}
}
return binding.root
}
}```
val todoData = arrayListOf<TodoData>()
todoData.add(TodoData(todo)
TodoData에 값을 직접 넣어줘야 하니, 읽기만 되는 List<>가 아니라 읽고 쓰기가 가능한 ArrayList로 넣어주고,
todoData.add()통해서 값을 넣어줍니다.
adapter.notifyItemInserted(todoData.size-1)
그 후에 notifyItemInserted() 통해 recycerview로 값을 보여줍니다.
상황 : editText에 값을 입력하지 않은 상태에서 버튼 클릭시 예외처리를 해주었는데, 참고한 코드대신 let함수를 사용하면 빈 리사이클러가 생기는 상황


해결 중
즉, editText(todo)값은 null이 아니라는 의미이므로 isEmpty() vs isBlanck() vs isNull() 차이점에 대해 찾아보았습니다.
isEmpty() vs isBlanck() vs isNull()
isEmpty() : 문자열의 길이가 0인경우 true 리턴합니다.
ex)(todo.length == 0)--> todo.isEmpty()
isBlanck() : 문자열이 비어 있거나, 빈 공백으로만 이루어져 있으면, true를 리턴합니다.
여기서 확인해 보면 ""(empty text)는 isNull()이 false값입니다.
null에 대한 개념을 다시 정리해봐야 할 것 같습니다.
참고사이트
https://huiveloper.tistory.com/20
https://jdroid.tistory.com/17
isEmpty() vs isBlanck()
https://velog.io/@kim-mg/velog-%EA%B8%80%EC%93%B0%EA%B8%B0-markdown-%EC%9E%91%EC%84%B1%EB%B2%95