在 recyclerView Kotlin 中实现 onItemClickLitsner -android

Implementing onItemClickLitsner in recyclerView Kotlin -android

我正在用 Kotlin 编写我的第一个 android 应用程序,我正在尝试在 android studio 3.0 中使用 kotlin 在 RecyclerView 中实现 onItemClickListner,但我找不到任何有用的东西。所以我有 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()
    }
}

和适配器 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
    }
}

当用户单击列表中的一个项目以打开另一个项目时,我需要这样做 Activity,什么是更清洁和最好的方法。

您可以使用 lambda 作为点击回调,例如作为适配器的 class 属性:

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

然后在 onCreateViewHolder

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

并且不要忘记从您的片段设置回调:

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