
코루틴 특강은 미니프로젝트 할 때 먼저 배울 예정
특강일에는 QNA와 과제로 진행
데이터 클래스를 사용하면 개발자의 편의를 위한 몇가지 메서드가 오버라이딩 됨
그냥 클래스를 사용해도 상관없으나 어떤 데이터를 관리하기 위한 목적이라면 데이터 클래스를 주로 사용함
학생 클래스 정의
DBHelper 클래스 정의
Dao 클래스 및 메서드 정의 -> select one, select all, insert, update, delete
select의 경우 rawQuery로 실행한 sql문 결과를 cursor에 담고 moveNext를 실행할때마다 레코드 한줄씩 접근할 수 있다.
select one인 경우 moveNext를 한번만 실행하고, select all이면 마지막 레코드에 접근할때까지 while문으로 반복한다. moveNext메서드는 레코드가 있을 때 true를 반환하고 남은 레코드가 없다면 false를 반환하기 때문에 while문의 반복 조건으로 사용할 수 있다.
학생 객체를 담을 리스트는 MainFragment에서만 사용하므로 관리적인 차원에서 MainActivity가 아닌 MainFragment에서 생성해서 사용한다.
각 프래그먼트에 사용할 데이터를 불러오는 메서드를 작성해준다. settingData()
MainFragment에는 학생객체를 담을 리스트 lateinit var studentList:MutableList<StudentModel>
InfoFragment에는 학생정보를 보여줄 학생 객체 lateinit var studentModel: StudentModel
데이터를 셋팅하는 메서드 setData
뷰를 셋팅하는 메서드 initView
툴바도 따로 메서드로 셋팅해준다. setToolbar
onCreateView에서 따로 정리한 메서드를 호출해준다.
balnk Fragment를 추가한다

modalBottomSheet 가 별도로 존재하지만 빈 프래그먼트로 따로 생성해도 상관없다


리사이클러뷰 항목 클릭시 나오게 설정
// MainSheetFragment.kt
class MainSheetFragment : BottomSheetDialogFragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_main_sheet, container, false)
}
}
// MainFragment.kt
override fun onBindViewHolder(holder: ViewHolderMain, position: Int) {
holder.mainRowBinding.textViewMainRowTitle.text = memoList[position].title
holder.mainRowBinding.root.setOnClickListener {
// BottomSheet를 띄워준다.
val mainSheetFragment = MainSheetFragment()
mainSheetFragment.show(mainActivity.supportFragmentManager, "BottomSheet")
}
}
항목을 클릭하면

항목을 클릭할때 해당 항목의 idx를 전달하는 방법은 다른 fragment와 똑같이 bundle을 사용하면 된다.
// MainFragment.kt
override fun onBindViewHolder(holder: ViewHolderMain, position: Int) {
holder.mainRowBinding.textViewMainRowTitle.text = memoList[position].title
holder.mainRowBinding.root.setOnClickListener {
// BottomSheet를 띄워준다.
val mainSheetFragment = MainSheetFragment()
// position번째 객체를 추출한다.
val sheetBundle = Bundle()
sheetBundle.putInt("memoIdx", memoList[position].idx)
mainSheetFragment.arguments = sheetBundle
mainSheetFragment.show(mainActivity.supportFragmentManager, "BottomSheet")
}
}
// MainSheetFragment.kt
class MainSheetFragment : BottomSheetDialogFragment() {
lateinit var fragmentMainSheetBinding: FragmentMainSheetBinding
lateinit var mainActivity: MainActivity
lateinit var memo:MemoModel
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
fragmentMainSheetBinding = FragmentMainSheetBinding.inflate(inflater)
mainActivity = activity as MainActivity
settingData()
settingView()
settingEvent()
return fragmentMainSheetBinding.root
}
fun settingData(){
val memoIdx = arguments?.getInt("memoIdx")!!
memo = MemoDAO.selectOneMemo(mainActivity,memoIdx)
}
fun settingView(){
fragmentMainSheetBinding.apply {
textViewSheetSubject.text = memo.title
textViewSheetText.text = memo.content
}
}
fun settingEvent(){
fragmentMainSheetBinding.apply {
buttonSheetDelete.setOnClickListener {
// 메모 삭제
MemoDAO.deleteMemo(mainActivity,memo.idx)
// 메모 데이터를 읽어온다.
mainActivity.reloadRecyclerView()
// 다이얼로그를 내려준다
dismiss()
}
}
}
}
메모 삭제 후 MainFragment의 리사이클러뷰를 갱신해줘야 하는데
MainFragment에 갱신 해주는 메서드를 작성해주고 MainActivity에서 해당 메서드를 호출하는 메서드를 또 작성한다.
메모 삭제 시 MainActivity에서 작성한 메서드를 호출
※ 출처 : 멋쟁이사자 앱스쿨 2기, 소프트캠퍼스