제목의 부분을 구현하는데 많은 고민이 되었다. 개념은 알겠는데 이걸 실제로 구현해서 사용하려고하니까 너무 막막했다. 그래서 블로그들을 찾아보고 나름 개발순서를 정리해보려고한다.
interface정의
interface onRecyclerViewItemClickListener {
fun onItemClick(view: View, position: Int)
}
interface onRecyclerViewItemLongClickListener {
fun onItemLongClick(view: View, position: Int)
}
실제 OnClick 구현(Adapter)
- 나는 이부분에서 가장 막막했다. 내가 하고싶은일은 item을 클릭했을때 해당 item의 값을 다른 Activity로 넘겨주고싶은데.. 이부분을 메인에서와 Adapter 두부분에 구현해주는게 막막했다. 일단은 Adapter에 View.OnClickListener를 상속받아주고 그 다음 내가 클릭한 itemView에 onClickLstener를 달아준다. 내가 클릭하는 item은 결국 ViewHolder에서 구현해주기때문에 ViewHolder에 View.OnClickListener를 상속해주었다.
class Holder(private val binding: MainItemRecyclerviewBinding, private val onItemClick: onRecyclerViewItemClickListener? = null) : RecyclerView.ViewHolder(binding.root), View.OnClickListener {
private lateinit var image: ImageView
private lateinit var title: TextView
private lateinit var location: TextView
private lateinit var price: TextView
private lateinit var chat: Button
private lateinit var like: Button
private lateinit var mOnItemClick : onRecyclerViewItemClickListener
init {
initView()
}
private fun initView() {
image = binding.itemMainImage
image.clipToOutline = true
title = binding.itemMainTitle
location = binding.itemMainLocation
price = binding.itemMainPrice
chat = binding.itemMainIconChat
like = binding.itemMainIconLike
}
fun bind(data: Product) {
image.setImageResource(data.image)
title.text = data.title
location.text = data.location
price.text = setComma(data.price) + "원"
chat.text = data.chat
like.text = data.like.toString()
// itemView는 item 한개를 뜻함.
// 생성할때 각 item에 onClickListener를 달아줌
itemView.setOnClickListener(this)
}
// 실제 onClick시 동작처리하는부분
// 우리는 Adapter를 생성할때 Main에서 받아온 interface를 넣어주었다.
// 이렇게되면 Main에서 OnClick시 할 일이 지정된 로직이 넘어와서 클릭시 실행되는것이다.
override fun onClick(p0: View?) {
onItemClick?.let{
mOnItemClick = onItemClick
// layoutPosition을 가져와 넘겨줌
onItemClick.onItemClick(p0!!, layoutPosition)
}
}
}
실제 구현(Main)
class MainPageActivity : BasePageActivity() {
private lateinit var binding: MainPageActivityBinding
private lateinit var spinner: Spinner
private lateinit var notificationButton: ImageButton
private lateinit var recyclerview: RecyclerView
private val spinnerItemList: MutableList<String> = mutableListOf()
private val recyclerviewItemList : MutableList<Product> = mutableListOf()
companion object {
fun newIntent(context: Context): Intent = Intent(context, MainPageActivity::class.java)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = MainPageActivityBinding.inflate(layoutInflater)
setContentView(binding.root)
initView()
initSpinner()
initRecyclerView()
initNotification()
}
// Main화면에서 Back Button 클릭시 처리
override fun onBackPressed() {
val positive = object : dialogButtonClicked {
override fun onPositiveButtonClick() {
finish()
}
}
exitDialog(positive)
}
override fun initView() {
spinner = binding.mainSpinner
notificationButton = binding.mainNotification
recyclerview = binding.mainRecyclerview
}
private fun initSpinner() {
// spinner 더미데이터 추가
spinnerItemList.addAll(resources.getStringArray(R.array.dummy_spinner_items))
val adapter = ArrayAdapter<String>(
this,
R.layout.spinner_item,
spinnerItemList
)
adapter.setDropDownViewResource(androidx.appcompat.R.layout.support_simple_spinner_dropdown_item)
spinner.adapter = adapter
}
private fun initRecyclerView() {
// 더미데이터 List주입
recyclerviewItemList.addAll(getDummyData())
// Adapter에 구현한 interface 로직을 여기에서 구현해준다.
val itemClickEvent = recyclerViewItemClickListener()
val adapter = MainPageRecyclerViewAdapter(recyclerviewItemList, itemClickEvent)
val divider = DividerItemDecoration(this, VERTICAL)
recyclerview.addItemDecoration(divider)
recyclerview.adapter = adapter
}
private fun initNotification() {
notificationButton.setOnClickListener {
notification(getString(R.string.notification_title), getString(R.string.notification_content))
}
}
// 위에 설명했던 실제 구현부분.
// Adapter에서 받은 position을 가져와 실제 Data를 접근한 후
// Parcelable Type으로 DetailPageActivity에 넘겨준다.
private fun recyclerViewItemClickListener() : onRecyclerViewItemClickListener{
return object : onRecyclerViewItemClickListener {
override fun onItemClick(view: View, position: Int) {
val item = recyclerviewItemList[position]
val intent = DetailPageActivity.newIntnet(this@MainPageActivity)
intent.putExtra(getString(R.string.intent_key_product), item)
startActivity(intent)
}
}
}
결과