프래그먼트를 상속하는 액티비티에, 리사이클러뷰의 어댑터 하나를 선언해놓았습니다.
이 어댑터 클래스 내부에서, 메인 액티비티로 데이터만 전달하려고 합니다.
(프래그먼트 전환이나 액티비티 전환 없이, 데이터만 전달하는 코드입니다.)
그런데, 어댑터 클래스 내부에서는 val activity = MainActivity() 이 객체가 없으면,
(acitivity ....<- 이 acitivity 부분이 빨간 글씨가 됩니다. ↓
(activity as MainActivity?)?.setDataAtFragment3("1")
위 코드는 프래그먼트 전환 없이, 데이터만 주고 받으려고 작성한 코드입니다. 어댑터 밖에서는 잘 작동합니다. 어댑터 내부에서만 작동을 하지 않습니다.
리사이클러뷰를 롱 클릭 했을때, 밑에서 바텀네비게이션뷰가 올라오도록 애니메이션을 설정해둔 상태입니다.
그런데, 리사이클러뷰를 롱 클릭하면, 화면이 강제로 종료되면서, 어플이 종료되고, 스마트폰 배경화면으로 나가버려집니다.
무엇때문에 종료되는 것인지 잘 모르겠으나, 아마도 프래그먼트에서 액티비티로 데이터 전달하는 방식이
잘못되어서 그런것 같습니다. 새로 추가한 저 객체 때문에 오류가 나는것 같습니다.
activity 부분에 무엇을 넣어주어야 정상 작동 할는지 잘 모르겠습니다.
private val tandf2 = SparseBooleanArray(0)
var istrue: Boolean = false //이 코드는 롱 클릭 후, 숏 클릭을 가능하게 해주려고 만든 코드다.
var vpos: ArrayList<Int>? = null
// 순서 7번 : 이렇게 만들어진 view객체를 인수로 사용하여 ViewHolder클래스로 반환해주면,
// ViewHolder클래스에서 메모리에 저장했다가, onBindViewHoler() 호출시 onBindViewHoler()의 매개변수에 전달하는 구조다.
// 이 뷰홀더 클래스에서 저장하고 있는 것들은, 뷰에 들어갈 icon, title, desc가 아니라, 뷰 그 자체다. 즉, 껍데기를 저장했다가, 바인딩 뷰홀더로 껍데기만 보내주는 것이다.
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
//var icon: ImageView
var title: TextView
var desc: TextView
var activity = MainActivity()
init {
// 뷰 객체에 대한 참조. (hold strong reference)
//icon = itemView.findViewById(R.id.ry_icon)
title = itemView.findViewById(R.id.ry_title)
desc = itemView.findViewById(R.id.ry_desc)
//이벤트 소스, 이벤트 리스너, 이벤트 핸들러
itemView.setOnLongClickListener(object : View.OnLongClickListener { // 컨버터 쓰면 object는 표기해주지 않는데, 이것으로 인해서 오류가 생기고, 도움말도 이것을 지적해주지 않아. 이거 조심하자.
override fun onLongClick(v: View): Boolean {
val pos = adapterPosition // 뷰홀더 클래스에서만 제공하는 아이템들의 포지션을 구해주는 함수다.
if (pos != RecyclerView.NO_POSITION) { // 아이템 뷰 하나가 재활용 될 때에, 또 다른 아이템 뷰 하나가 삭제되므로, 노 포지션을 반환하기 때문에 이렇게 조건문에 넣어줘야 한다고 한다.
if (istrue != true) {
(activity as MainActivity?)?.setDataAtFragment3("1")
tandf2.put(pos, true)
v.setBackgroundColor(0x4d00FF7B)
istrue = true
/*
when (pos) {
pos -> vpos = arrayListOf(pos) // 여기서 포지션값을 변수에 저장해놓으면, 그 포지션값을 다시 가져와서,
} // 선택된 포지션은 다시 화이트로, 선택되지 않은 포지션들은 회색으로 칠해 줄 수 있도록 조건문을 작성한다.
*/
} else {
(activity as MainActivity?)?.setDataAtFragment3("0")
tandf2.clear() //이 코딩을 해줘야, 롱클릭을 다시 눌렀을때, 전체 해제된다.
notifyDataSetChanged()
istrue = false
}
// 데이터 리스트로부터 아이템 데이터 참조. - 화석
/*
mData?.set(pos, RecyclerItem())
notifyItemChanged(pos)
*/
}
return true //true로 하면 진동이 느껴지고, false로 하면 무진동이 된다.
}
})
itemView.setOnClickListener(object : View.OnClickListener {
override fun onClick(v: View?) {
val pos = adapterPosition
if (pos != RecyclerView.NO_POSITION) {
if (istrue == true) {
if (tandf2.get(pos, false)) {
tandf2.put(pos, false)
v?.setBackgroundColor(0x000000)
} else {
tandf2.put(pos, true)
v?.setBackgroundColor(0x4d00FF7B/*Color.BLUE*/)
}
}
/*
when (pos) {
pos -> vpos = arrayListOf(pos)
}
when (vpos) {
vpos -> {
desc.setBackgroundColor(0xffffff)
}
}*/
}
}
})
}
}