Mehdi silber
Mehdi silber

Reputation: 31

Implementing onItemClickLitsner in recyclerView Kotlin -android

I'm writing my first android app in Kotlin and I am trying to implement onItemClickListner in a RecyclerView using kotlin in android studio 3.0 but i cant find any thing useful yet . so i have movieListFRagment :

class MoviesListFragment : Fragment() {    
    private var mListener: OnFragmentInteractionListener? = null
    private var movieList = ArrayList<Movies>()
    private var mAdapter: MoviesRecyclerAdapter? = null       
    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        // Inflate the layout for this fragment
        return inflater!!.inflate(R.layout.fragment_movies_list, container, false)
    }    
    override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)    
        mAdapter = MoviesRecyclerAdapter(movieList)
        val mLayoutManager = LinearLayoutManager(this.activity)    
        recyclerView!!.layoutManager = mLayoutManager
        recyclerView!!.itemAnimator = DefaultItemAnimator()
        recyclerView!!.adapter = mAdapter    
        prepareMoviesData()  }

    interface OnFragmentInteractionListener {
        // TODO: Update argument type and name
        fun onFragmentInteraction(uri: Uri)
    }    
    private fun prepareMoviesData() {
        var movie = Movies("Mad Max: Fury Road", "Action & Adventure", "2015")
        movieList.add(movie)    
        movie = Movies("Inside Out", "Animation, Kids & Family", "2015")
        movieList.add(movie)   
        movie = Movies("Star Wars:The Force Awakens", "Action", "2015")
        movieList.add(movie)
        mAdapter!!.notifyDataSetChanged()
    }
}

and the adapter MoviesRecyclerAdapter :

class MoviesRecyclerAdapter(private val moviesList: List<Movies> ) : RecyclerView.Adapter<MoviesRecyclerAdapter.MyViewHolder>() {


     class MyViewHolder(view: View  ) : RecyclerView.ViewHolder(view) ,View.OnClickListener {

        var title: TextView = view.findViewById<TextView>(R.id.title)
        var year: TextView = view.findViewById<TextView>(R.id.year)
        var genre: TextView = view.findViewById<TextView>(R.id.genre) 
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        val itemView = LayoutInflater.from(parent.context)
                .inflate(R.layout.movie_list_row, parent, false)

        return MyViewHolder(itemView )
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        val Movies = moviesList[position]
        holder.title.text = Movies.title
        holder.genre.text = Movies.genre
        holder.year.text = Movies.year

    }

    override fun getItemCount(): Int {
        return moviesList.size
    }
}

i need to when user click an item in the list to open an other Activity, what is the cleaner and the best way to do so.

Upvotes: 1

Views: 2696

Answers (1)

fweigl
fweigl

Reputation: 22008

You can use a lambda as the click callback, e.g. as a class property of your adapter:

var onItemClick: (Int) -> Unit = {}

then in onCreateViewHolder:

itemView.setOnClickListener { 
   onItemClick(viewHolder.getAdapterPosition()) 
}

and dont forget to set the callback from your fragment:

adapter.onClick = { position -> 
   // do something here
}

Upvotes: 3

Related Questions