android/ editText로 값 받아서 recyclerview로 보여주기

hyewoon·2023년 12월 10일

android

목록 보기
1/8
post-thumbnail

기존에는 데이터를 미리넣어두고 그것을 recyclerview로 보여주는 로직이었습니다.


이번에는 editText로 입력값을 받고 그것을 저장한 다음 recyclerview 로 보여주는 형태를 만들어 보겠습니다.

깃허브저장소

입력값 --> Arraylist에 담기 --> recyclerview로 값 보여주기

editText값 recyclerView 로 보여주기

  1. TodoData 클래스 만들기
data class TodoData(val list : String) {

}
  1. fragment_test3.xml에 editText와 button 넣기
<?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
  }
}
  1. 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

profile
곰곰

0개의 댓글