리사이클러뷰, 커스텀 리스너를 이용한 글쓰기 페이지

김가영·2020년 10월 14일
0

Android

목록 보기
4/6
post-thumbnail

얼굴모양 출처:

Icons made by Freepik from www.flaticon.com

RecyclerView 만들기

item_rating_makePost.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="20dp"
    android:layout_height="20dp"
    android:layout_marginRight="10dp">
    <ImageView
        android:id="@+id/iv_ratingMake"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/ic_smile"/>
</LinearLayout>

RatingMakePostAdapter

item 수는 항상 고정

package com.gyoung.movierecord.data

import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.gyoung.movierecord.R
import kotlinx.android.synthetic.main.item_rating_make_post.view.*

class RatingMakePostAdapter(private val context: Context): RecyclerView.Adapter<RatingMakePostHolder>() {

    var clickdIdx = 0

  	// xml file을 inflate한 후 viewHolder를 만든다.
      override fun onCreateViewHolder(parent: ViewGroup, viewType: Int):  RatingMakePostHolder{
  	    val view = LayoutInflater.from(context).inflate(R.layout.item_rating_make_post, parent,false)
  		return RatingMakePostHolder(view)
      }

      override fun getItemCount(): Int {
  		 return 5
      }
  	  // viewholder의 항목을 구성하기 위해 호출된다.
      override fun onBindViewHolder(holder: RatingMakePostHolder, position: Int) {
          if(position<=clickdIdx){
              holder.setSelected()
          }else{
              holder.setUnSeleced()
          }
          holder.itemView.setOnClickListener {
              clickdIdx = position
              this.notifyDataSetChanged()
          }
      }
  }

class RatingMakePostHolder (itemView: View) : RecyclerView.ViewHolder(itemView){
    fun setSelected(){
        Glide.with(itemView.context).load(R.drawable.ic_smile_selected).into(itemView.iv_ratingMake)
    }
    fun setUnSeleced(){
        Glide.with(itemView.context).load(R.drawable.ic_smile).into(itemView.iv_ratingMake)
    }
 }

책 검색 페이지에서 선택된 데이터 받아오기

  • MakePostActivity.kt( 게시글 작성 ) 에서 책을 검색하는 페이지를 열어줄 때 startActivityForResult를 이용해준다.
val intent = Intent(this, SearchItemActivity::class.java)
startActivityForResult(intent, SEARCH_BOOK)

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)

    if(resultCode== Activity.RESULT_OK){
        try{
            title = data!!.getStringExtra("title").toString()
            author = data!!.getStringExtra("author").toString()
            thumbnail = data!!.getStringExtra("thumbnail").toString()

            Log.d("MakePost", title)

        }catch (e : Exception){
            title = ""
            author = ""
            thumbnail = ""
        }
        et_title_makePost.setText(title)
        et_author_makePost.setText(author)
        if(!thumbnail.isNullOrBlank()){
            Glide.with(this).load(thumbnail).into(iv_mainImage_makePost)
        }
    }
}
  • SearchItemActivity.kt 에는 책을 나열한 RV adapter 에서 clickEvent 를 전달받을 interface를 정의
interface SearchItemClickListener{
        fun onClick(documents : Documents)
}
  • fun onCreate에서 interface를 구성해주고 rv_adapter 에 넣어준다.
searchItemClickListener = object : SearchItemClickListener{
            override fun onClick(documents: Documents) {
                val intent = Intent()
                intent.putExtra("title", documents.title)
                intent.putExtra("author", documents.authors[0])
                intent.putExtra("thumbnail", documents.thumbnail)
                setResult(Activity.RESULT_OK, intent)
                finish()
            }
        }
rv_adapter.datas = datas
rv_adapter.listener = searchItemClickListener
rv_main_searchItem.adapter = rv_adapter
  • rv_adapter 의 onBindViewHolder에서 itemView의 클릭을 받으면 customListener의 이벤트를 발동시켜 작동하도록
override fun onBindViewHolder(holder: SearchItemMainHolder, position: Int) {
  holder.bind(datas[position])
  holder.itemView.setOnClickListener {
      Log.d("SearchItemMainAdapter", datas[position].toString())
    listener.onClick(datas[position])
  }
}
profile
개발블로그

0개의 댓글