Funciones Lambda de Kotlin para devoluciones de llamada del adaptador RecyclerView en Android

¿Está utilizando una forma antigua y larga de Java para crear y manejar devoluciones de llamada en Android con interfaces? En caso afirmativo, es un muy buen momento para activar las funciones Lambda de Kotlin o las funciones de orden superior para crear y gestionar las devoluciones de llamada. Es una manera mucho más corta, simple y fácil.

Primero echemos un vistazo rápido a la forma más antigua de estilo Java

Recuerde que cuando necesite implementar la funcionalidad de clic en sus elementos RecyclerView , cree una interfaz que tenga todos los métodos para manejar sus elementos RecyclerView con diferentes clics e implemente todas esas funciones de interfaz dentro de su actividad/fragmento para realizar algunas acciones (por ejemplo: para navegar de la pantalla actual a otra u otra cosa). Y luego pasa la referencia de esa interfaz a su adaptador a través del constructor. Luego usamos esa interfaz en el adaptador para invocar/llamar a sus funciones para generar devoluciones de llamada dentro de la actividad/fragmento. Ahora mira lo largo que es el proceso y aquí entra en juego el poder de Kotlin… A ver

Funciones de Kotlin Lambda para devoluciones de llamada de adaptador

En primer lugar, di adiós a la larga interfaz de usuario… ahora agregaremos la función lambda como argumento en el constructor de nuestro adaptador. Estamos tomando MoviesAdapter como un ejemplo que toma la función moviesList y lambda llamada ‘onItemClicked’ como argumento y en nuestra función lambda ‘onItemClicked’ hemos agregado un objeto de película como argumento para que podamos recibir este objeto de película en la devolución de llamada de esta función lambda en nuestro fragmento/actividad.

Kotlin

class MoviesAdapter(
    private var moviesList: List<Movie>,
    // Here we have added lambda function
    // named 'onItemClicked' as an argument
    // that will itself take movie object as an
    // argument & will return unit means nothing
    private var onItemClicked: ((movie: Movie) -> Unit)
) : RecyclerView.Adapter<MoviesAdapter.ViewHolder>() {
 
 
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        // Just to show as an example we took layout
        // 'MovieItem' as recyclerview items/views.
        val binding = MovieItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        return ViewHolder(binding)
    }
 
 
    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        // getting a movie from movieList &
        // passing in viewholder's bind function
        holder.bind(moviesList[position])
    }
     
    inner class ViewHolder(val binding: MovieItemBinding) : RecyclerView.ViewHolder(binding.root) {
     
        fun bind(movie: Movie) = binding.apply {
            // Just setting movie details to
            // movieName & movieDescription textviews
            tvMovieName.text = movie.name
            tvMovieDescription.text = movie.description
           
            // Adding clickListener to
            // root layout of this item
            root.setOnClickListener {
                // Invoking this lambda function so that
                // it can give callback in our activity/fragment
                // We are also passing movie object
                // in it while invoking/calling it
                 onItemClicked(movie)
            }
        }
    }
 
    override fun getItemCount(): Int {
        return languageList.size
    }
}

En este ejemplo, estamos usando Viewbinding en RecyclerView Adapter . Ahora vamos a movernos dentro de la función de vinculación de Viewholder, dentro de ella, simplemente estamos configurando detalles de la película como el nombre de la película, la descripción de los elementos de RecyclerView y tenemos que agregar la funcionalidad de clic a cada elemento de RecyclerView para que podamos realizar alguna acción al hacer clic. Entonces, en clickListener de la raíz de nuestro elemento, en realidad estamos invocando nuestra función lambda onItemClicked y pasando la película en ella. Entonces, de esta manera, recibiremos una devolución de llamada en nuestro fragmento/actividad, ya que se invocará aquí al hacer clic en el elemento. Ahora veamos cómo…

Vamos a crear el objeto del adaptador y pasarle la función Lambda

Estamos tomando MovieListFragment como ejemplo aquí:

Kotlin

class MovieListFragment : Fragment() {
 
    // Declaring moviesAdapter with lateinit
    private lateinit var moviesAdapter: MoviesAdapter
   
    // using viewbinding
    private var _binding: FragmentMovieListBinding? = null
    private val binding get() = _binding!!
 
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        _binding = FragmentMovieListBinding.inflate(inflater, container, false)
        return binding.root
    }
 
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
 
        // Assume that getMoviesList() is returning
        // list of movies let's say from api call
        val moviesList : List<Movie> = getMoviesList()
         
        // Setting up movies recyclerview
        binding.moviesRecyclerView.layoutManager = LinearLayoutManager(requireContext())
        binding.moviesRecyclerView.setHasFixedSize(true)
      
        // Instantiating moviesAdapter & passing
        // lambda function in it's constructor
        moviesAdapter = MoviesAdapter(moviesList) { it: Movie ->
            // Here we'll receive callback of
            // every recyclerview item click
            // Now, perform any action here.
            // for ex: navigate to different screen
        }
         
        // Setting adapter to moviesRecyclerView
        binding.moviesRecyclerView.adapter = moviesAdapter
    }
}

Aquí, simplemente estamos creando una instancia de moviesAdapter, por lo que requerirá que pasemos la lista de películas y funciones lambda en su constructor. Así que ahora, aquí en el bloque de función lambda, estamos obteniendo un objeto de película, lo que significa que cada vez que se invoque esta función lambda desde el adaptador, recibiremos una devolución de llamada aquí con el objeto de película y ahora podemos realizar cualquier acción que deseemos. quiere bajo este bloque de función lambda. Eso es todo, así es como usamos las funciones Lambda de Kotlin para las devoluciones de llamada del adaptador RecyclerView en lugar de las interfaces.

Nota : Podemos usar estas funciones lambda para crear/manejar devoluciones de llamada no solo en el adaptador de recyclerview, sino donde queramos este tipo de funcionalidad en nuestro proyecto.

Publicación traducida automáticamente

Artículo escrito por haiderfaizan732 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *