DesarrolloLibre

Desarrollo Web, Android, juegos y mucho más

Categorias
12-12-2017

En una anterior entrada hablamos un poco sobre el futuro (y presente) de Kotlin en el mundo del desarrollo de aplicaciones Android empleando este lenguaje de programación que poco a poco intenta ir reemplazando a Java como lenguaje primario y oficial en el desarrollo de aplicaciones Android.

kotlin para el futuro en el desarrollo de aplicaciones android

Para darle continuidad y soporte a algunos de los argumentos realizados en la anterior entrada, hoy veremos cómo realizar un sencillo listado de elementos mediante un RecyclerView empleando netamente Kotlin como lenguaje de programación; es decir, nada de Java.

Mismo enfoque: eventos, clases pero diferente sintaxis

Las clases a emplear para crear un listado con RecyclerView con Kotlin serán las mismas empleadas para el desarrollo de un Recyclerview empleando Java. la clase modelo, adaptador y por supuesto la actividad, también necesitaremos un par de layouts; uno para la actividad y otro para el listado que vendría siendo nuestro RecyclerView.

La clase modelo

Aquí definimos una clase Item que contará con un identificador y una descripción:

data class Item(val id: Long, val title: String, val description: String)

La actividad principal

Una novedad que tiene Kotlin con respecto a Java es que mediante el nombre del identificador del elemento en el layout; (por ejemplo android:id="@+id/rv_item" para definir el identificador del RecyclerView en el layout de nuestra actividad) es suficiente para referenciar en la actividad o clase que establece el contenido de dicha vista, y por lo tanto en Kotlin ya no es necesario establecer el valor de dichas variables como se hace en Java-Android:

RecyclerView rv_item = (RecyclerView) findViewById(R.id.rv_item);

Finalmente el código de la Actividad:

import android.content.Context
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.LinearLayoutManager
import android.widget.Toast
import kotlinx.android.synthetic.main.activity_main.*
import mykotlin.dl.recyclerview.recyclerviewkotlin.adapter.ItemAdapter
import mykotlin.dl.recyclerview.recyclerviewkotlin.model.Item
import kotlin.dl.recyclerview.recyclerviewkotlin.R

class MainActivity : AppCompatActivity() {

   override fun onCreate(savedInstanceState: Bundle?) {
       super.onCreate(savedInstanceState)
       setContentView(R.layout.activity_main)

       val items =  getLists()

       rv_item.layoutManager = LinearLayoutManager(this)
       rv_item.hasFixedSize()
       rv_item.adapter = ItemAdapter(items)

       rv_item.layoutManager = LinearLayoutManager(this)
       rv_item.adapter = ItemAdapter(items)

   }

   fun getLists(): ArrayList<Item> {
       var lists = ArrayList<Item>()
       lists.add(Item(1, "Item 1", "Descripcion 1"))
       lists.add(Item(1, "Item 2", "Descripcion 2"))
       lists.add(Item(1, "Item 3", "Descripcion 3"))
       lists.add(Item(1, "Item 4", "Descripcion 4"))
       return lists;
   }
}

La actividad anterior se encarga de definir el tipo de layout (que en este caso será listado tipo ListView) y de popular (llenar) un ArrayList de tipo Item con algunos datos de prueba y de por supuesto, crear una instancia del adaptador que creará el listado que definimos en el siguiente bloque dentro de esta entrada.

La clase adaptador

La clase adaptador, que es la que se encarga de definir el comportamiento y estilo de cada uno de los componentes del listado, como podemos ver, se realiza el mismo nombrado para sobrescribir cada uno de las funciones heredadas de la clase RecyclerView.Adapter; nuevamente empleamos el nombre de los items de cada elemento definido en la vista sin necesidad de referenciarlos primero (ej: itemView.tv_description):

import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import kotlinx.android.synthetic.main.adapter_item.view.*
import kotlin.dl.recyclerview.recyclerviewkotlin.R
import mykotlin.dl.recyclerview.recyclerviewkotlin.model.Item

class ItemAdapter  (val userList: ArrayList<Item>) : RecyclerView.Adapter<ItemAdapter.ViewHolder>() {
  
   override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
       val v = LayoutInflater.from(parent.context).inflate(R.layout.adapter_item, parent, false)
       return ViewHolder(v)
   }
  
   override fun onBindViewHolder(holder: ViewHolder, position: Int) {
       holder.bindItems(userList[position])
   }
  
   override fun getItemCount(): Int {
       return userList.size
   }
  
   class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

       fun bindItems(item: Item) {
           itemView.tv_title.text=item.title
           itemView.tv_description.text=item.description

       }
   }
}

El layout de nuestra actividad

En cuanto a los layouts, se mantienen exactamente los mismos que usamos en Java-Android:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   tools:context="mykotlin.dl.recyclerview.recyclerviewkotlin.MainActivity">

   <android.support.v7.widget.RecyclerView
       android:layout_width="match_parent"
       android:id="@+id/rv_item"
       android:layout_height="wrap_content">

   </android.support.v7.widget.RecyclerView>

</android.support.constraint.ConstraintLayout>

El layout de nuestro listado

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:orientation="vertical">

   <TextView
       android:id="@+id/tv_title"
       android:layout_width="match_parent"
       android:layout_height="wrap_content" />

   <TextView
       android:id="@+id/tv_description"
       android:layout_width="match_parent"
       android:layout_height="wrap_content" />

</LinearLayout>

Como podemos ver la lógica empleada es la misma que empleamos con Java, te invito a que revises algunas de las anteriores entradas que están listadas al final de esta entrada y las compares con estas para ver la similitud que existe entre ambas.

Finalmente, obtenemos un listado como este:

Puedes darle el estilo que quieras modificando el layout o el XML de estilo como prefieras, para darle el diseño a tu gusto; la idea en esta entrada era mostrar cómo crear un RecyclerView empleando netamente Kotlin como lenguaje de programación y no centrarnos en el diseño.

Conclusión

Cómo podemos ir viendo, Kotlin es un lenguaje completo que nos permite desarrollar aplicaciones en Android más fácil (al menos en lo que a sintaxis se refiere) que con Java, puedes emplear otros elementos que ya vimos en anteriores entradas para darle más vida al listado presentado anteriormente:


Publicidad

Give me for a beer!

Algunos recursos que te pueden interesar

Paleta de colores para el Material Design

Paleta de colores para el Material Design

Librería oficial de PayPal para Android

Librería oficial de PayPal  para Android

Creando increibles Drawer en Android con MaterialDrawer

Creando increibles Drawer en Android con MaterialDrawer

Algunos artículos que te pueden interesar

Animando los SVG con CSS

Animando los SVG con CSS

En esta entrada veremos cómo emplear las animaciones con los SVGs, específicamente emplearemos el logo de Android con el cual hemos trabajado desde entradas pasadas.

Andrés Cruz 15-06-2015

Cómo generar una apk en Android Studio para la Google Play

Cómo generar una apk en Android Studio para la Google Play

Se explica como generar una apk firmada que puede ser empleada para subir a la Google Play desde Android Studio.

Andrés Cruz 30-11-2016

Las primeras apps: Dolphin Note y List 1.0

Las primeras apps: Dolphin Note y List 1.0

Hoy les vengo a hablar de un par de aplicaciones que he venido desarrollando hace unos cuantos meses para Android y que he puesto finalmente en la Google Play.

Andrés Cruz 10-08-2015