Listar contactos utilizando ArrayList con lenguaje Kotlin
En este artículo, explicaré como podemos utilizar un ArrayList (Collections) para listar los contactos al igual que lo hace WhatsApp por ejemplo, para dejar en claro que este ejemplo será estático lo que quiere decir es que no se podrá modificar en cuanto a persistencia de datos, para ello se utilizará el Adaptador ListView y a continuación veremos que es un Adaptador.
Pero qué es un Adaptador y para qué sirve...
Para poder trabajar directamente con Android Studio utilizando el lenguaje de Kotlin o Java es necesario utilizar el mecanismo que hace de puente entre nuestros datos y lo que queremos mostrar el cual se consideran las vistas contenidas dentro del componente ListView (también pueden ser GridView o Spinner). Es cierto que para poder mantener la persistencia de los datos en este proceso es muy frecuente utilizar bases de datos para nuestras aplicaciones sean de escritorio, web o móviles, existen adaptadores específicos para este caso. La forma de trabajar habitual es hacer una consulta en una base de datos (comando SQL SELECT) y obtener un objeto Cursor con el resultado. Este objeto será pasado al adaptador para que lo recorra y cree tantas vistas como registros se hayan encontrado.
Pero que es es un Fragment y para qué sirve...
Para poder mejorar las vistas dentro de nuestra aplicación y dividirlas de modo tal que pueda pasarse como una paginación, se puede utilizar fragmentos, los cuales permiten que una aplicación se divida en subcomponentes para poder manejarlos de manera individual y combinarlos de distintas formas como si fuesen paneles. Es decir, en un dispositivo de pantalla pequeña (como un teléfono inteligente o tableta), una actividad típicamente llena toda una pantalla., mostrando los diversos puntos de vista que componen la interfaz de usuario de una aplicación. La actividad es esencialmente un contenedor. Sin embargo, cuando una actividad se muestra en un dispositivo de pantalla grande, como en una Tablet, la pantalla se vuelve mucho más grande y todos los elementos en una actividad deben estar dispuestos a hacer un uso completo de la pantalla más grande lo que resulta en cambios complejos a la jerarquía de visualización.
Otro control fundamental para el desarrollo de aplicaciones universales para Windows es el ListView.
Ahora veremos un Wireframe de como se utilizará el ListView:
Muestra una lista de items(cada item de la lista puede estar compuesto por varios controles visuales) y nos permite interactuar con sus elementos (seleccionarlos, borrarlos, reordenarlos, entre otras acciones etc.)
Ahora crearemos un proyecto nuevo llamado Agenda, accederá a una ArrayList que se creará de manera estática y el adaptador dentro de un ListView se encargará de cargarlo. El cual se mostrará como en el siguiente diseño.
Comenzaremos abriendo nuestro Android Studio, y comenzamos creando nuestro proyecto utilizaremos el lenguaje Kotlin por estar actualmente disponible.
//Por Ing. Dick Díaz Delgado
implementation 'androidx.fragment:fragment:1.0.0'
implementation 'androidx.navigation:navigation-fragment:2.0.0'
implementation 'androidx.navigation:navigation-ui:2.0.0'
implementation 'com.github.bumptech.glide:glide:4.10.0'
implementation 'de.hdodenhof:circleimageview:3.1.0'
//Por Ing. Dick Díaz Delgado
val fragmentManager = supportFragmentManager
fragmentManager.beginTransaction().replace(R.id.fragmento_principal, ContactoFragment(), "ContactoFragment").commit()
//Por Ing. Dick Díaz Delgado
class ContactoAdapter(private val context: Context, private val dataSource: ArrayList<Contacto>) : BaseAdapter() {
//Obtenermos diseño para que este se cree al momento de llamar al adapter
private val inflater: LayoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
//Obtener la cantidad de Elementos del ListView
override fun getCount(): Int {
return dataSource.size
}
//Obtener el elemento según la posición
override fun getItem(position: Int): Any {
return dataSource[position]
}
//Obtener el identificador según la posición
override fun getItemId(position: Int): Long {
return position.toLong()
}
//Creamos el método getView para la vista de nuestro Adapter
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
//Obtenemos la vista y la colocamos a una variable para poder utilizarla e inicializar
val rowView = inflater.inflate(R.layout.list_item_contacto, parent, false)
//Obtener el elemento imagen
val imagen = rowView.findViewById(R.id.iv_avatar) as CircleImageView
//Obtener el elemento nombre
val nombre = rowView.findViewById(R.id.tv_name) as TextView
//Obtener el elemento cargo
val cargo = rowView.findViewById(R.id.tv_title) as TextView
//Obtener el elemento empresa
val empresa = rowView.findViewById(R.id.tv_company) as TextView
//Instanciamiento del objeto contacto de la clase Contacto
val contacto = getItem(position) as Contacto
//Asignación de valores a los elementos según corresponda el indice
nombre.text = contacto.nombre
cargo.text = contacto.cargo
empresa.text = contacto.empresa
Glide.with(context).load(contacto.imagen).into(imagen);
return rowView
}
}
Anteriormente se creo el ContactoFragment.kt, lo que haré es modificar la estructura de este archivo a través del siguiente código:
//Por Ing. Dick Díaz Delgado
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.ListView
import androidx.fragment.app.Fragment
import app.avanzado.agenda.R
import app.avanzado.agenda.adapter.ContactoAdapter
import app.avanzado.agenda.clase.Contacto
class ContactoFragment : Fragment() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? {
val root: View = inflater.inflate(R.layout.fragment_contacto, container, false)
var mContactoList = root.findViewById<View>(R.id.contacto_list) as ListView
var mContactoAdapter : BaseAdapter
val contactos: ArrayList<Contacto> = ArrayList()
contactos.add(
contactos.size,
Contacto("1", "Hugh Larie", "Médico Cirujano", "EsSalud", "https://noverbal.es/uploads/blog/rostro-de-un-criminal.jpg")
)
contactos.add(
contactos.size,
Contacto("2", "Taylor Swift", "Cantante", "Big Machine Records Republic Records", "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQhgsWm5w1W9vHMQoOzsqmWM4fsygzsCvp2JxPg4qiz5YrBMA4oJcxG-PHJVVbgmAfXLs8&usqp=CAU")
)
contactos.add(
contactos.size,
Contacto("3", "Dick Díaz Delgado", "Docente", "Universidad César Vallejo", "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9nfewnrUuM58saEtKcUxU3ka3PbHcUIvGARn_ae5A0BQ7rIe0TvnaaexLH6TN0XJ6_QSQXO9Uom2Y4AOK5dZ4VS2OjCDoJ2vFh1j3Lqfj8KvipLtAlqx3RfZLswaWoqFAMJdkTd9V3zY/s95-pf/1.png")
)
contactos.add(
contactos.size,
Contacto("4", "Daniel Radcliffe", "Actor", "Warner Bross", "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTy8KH0Wk2Znad97x3FMEIrVoK4qGToyayolIbInRs1MvGSIWOxaAugGQ-Wnkxbn8n2MjY&usqp=CAU")
)
contactos.add(
contactos.size,
Contacto("5", "Sandra Bullock", "Actriz", "Netflix", "https://www.univision.com/proxy/api/cached/picture?href=https%3A%2F%2Fst1.uvnimg.com%2Fad%2Fb4%2Fb82e44cb4e8f84cc0c7950cc6d1b%2F05b2d773e5aa4aeb95dcfd3971cb8730&width=214&height=320&ratio_width=303&ratio_height=303&resize_option=Fill%20Area")
)
contactos.add(
contactos.size,
Contacto("6", "Angela Aguilar", "Cantante", "El Financiero", "https://laopinion.com/wp-content/uploads/sites/3/2021/09/GettyImages-1174354474-e1631743859271.jpg?quality=80&strip=all&w=1200")
)
// Inicializar el adaptador con la fuente de datos.
mContactoAdapter = ContactoAdapter(requireActivity(), contactos)
mContactoList.adapter = mContactoAdapter
setHasOptionsMenu(true);
return root;
}
}
El resultado sería el siguiente:
Esto es uno de los ejemplos sencillo, puedes utilizar una base de datos que puedes acceder a través de una url o json, como también una NoSQL, como en el caso de Firebase RealTime o Firestore. Te dejo el link donde podrás descargar el proyecto desde este enlace.
Espero haya sido de gran ayuda este artículo.






















Comentarios
Publicar un comentario