在 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
}
我正在用 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
}