Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks Magazines
News
Documents
Sheet Music
copia de un gran trabajo
Save
Embed
Share
Print
Download
Join
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
Sign up to vote on this title
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Upload
Sign In
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Download
Magazines
News
Documents
Sheet Music
Join
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
Tutorial Para Desarrollar Una App Android Para Productos, Clientes Y Pedidos (Nivel #1) El título es claro.
En esta serie de tutoriales te mostraré como crear una aplicación que adminis productos, clientes y pedidos basados en una base de datos en un servidor. ¿Qué significa Nivel #1?
Qué el actual tutorial que estás leyendo tiene el siguiente alcance:
Vamos a ver crear una REST API para leer los productos que tienes en tu serv y ponerlos en una lista (RecyclerView).
Te mostraré los pasos, herramientas, y conceptos para desarrollar esta característica de una forma sencilla, limpia, mantenible y sobre todo entendib
El código completo de la app y el servicio REST puedes encontrarlo en la mism carpeta de este tutorial.
App Productos Sign up to vote on this title
Al igual que en todos los tutoriales que he creadosobre Useful Desarrollo Not usefulAndroid, e también trae una app de ejemplo llamada “App Productos”.
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Upload
Sign In
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Download
Magazines
News
Documents
Sheet Music
Join
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
Tutorial Para Desarrollar Una App Android Para Productos, Clientes Y Pedidos (Nivel #1) El título es claro.
En esta serie de tutoriales te mostraré como crear una aplicación que adminis productos, clientes y pedidos basados en una base de datos en un servidor. ¿Qué significa Nivel #1?
Qué el actual tutorial que estás leyendo tiene el siguiente alcance:
Vamos a ver crear una REST API para leer los productos que tienes en tu serv y ponerlos en una lista (RecyclerView).
Te mostraré los pasos, herramientas, y conceptos para desarrollar esta característica de una forma sencilla, limpia, mantenible y sobre todo entendib
El código completo de la app y el servicio REST puedes encontrarlo en la mism carpeta de este tutorial.
App Productos Sign up to vote on this title
Al igual que en todos los tutoriales que he creadosobre Useful Desarrollo Not usefulAndroid, e también trae una app de ejemplo llamada “App Productos”.
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
Join
copia de un gran trabajo
Save
Embed
Share
Print
Download
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
Magazines
News
Documents
Pero he aquí la parte buena:
Sheet Music
Te he creado una plantilla con la ruta óptima para que superes las adversidad particulares de tu proyecto. ¿Quieres verla? ¡Bien!
Checklist Para Desarrollar Tu App D Productos
Lo primero que vamos a escudriñar, son los pasos precisos que daremos par ejecutar exitosamente nuestra aplicación.
Esto puedo variar de programador a programador (de equipo a equipo, si es tu caso).
A mí en particular me gusta seguir un orden predefinido de lo que voy a realiz Definiendo el orden, las condiciones de uso, las herramientas y las prácticas q usaré. A la suma de estos factores se le llama Metodología.
Independientemente de que profesión tengas o que proyecto vayas a realizar siempre tendrás una metodología. Ya sea una copiada, improvisada, propia, o hibrida. ¿Qué tal te va con la tuya? Sign up to vote on this title
Si no tienes. Te recomiendo que comiences con esta:
1. Definir el propósito general de la app
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Upload
Sign In
Join
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Download
Magazines
News
Documents
Sheet Music
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
7. Desarrollar versión “cascaron” de la app 8. Crear servicio REST 9. Implementar cliente HTTP con Retrofit
Quedas en libertad de mover, eliminar y agregar pasos que se ajusten a tu car y conocimientos. Eres tú quien eliges tu ruta. Yo solo te mostraré cómo ponerla en marcha en este instante…
Paso #1. Definir El propósito De La Ap El propósito es el objetivo general que deseas alcanzar con tu app. Una simple frase de no más de 3 renglones que resuma tu futuro perfecto. Por ejemplo:
You're Reading a Preview
Unlock full access a free trial. “La App reducirá los tiempos del análisis dewithmitigación de 4 horas a 1 hora”
“La App incrementará los tiempos de toma pedidos Download Withde Free Trial de nuestros meseros e 30%”
¿Ves el formato? Usamos una métrica que evidencie la mejora de una situación. Simple. En el caso de “App Productos” tenemos:
Sign up to vote on this title
Useful useful menos “Encontrar productos solicitados por un cliente en deNot 2 segundos y to pedidos digitalmente”
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
Join
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
1
Download
Magazines
News
Documents
Sheet Music
Proyecto - Martin - TICS
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
Paso #2. Recolectar Necesidades
Esta etapa es muy conocida por la mayoría de ingenieros de sistemas asocia análisis de software.
Básicamente aquí debes crear una lista con las funcionalidades que tendrá el sistema basado en los objetivos del usuario. En las metodologías tradicionales a la necesidad se le califica como “Requerimiento”. En metodologías ágiles se le llama “Historia de usuario”.
(No entraré a explicar los alcances de ambos por cuestiones de simplicidad). Ahora, aplicando este paso, supondremos que el usuario (administrador del negocio, supervisor, tú mismo, etc.) necesita:
Una lista de todos los productos del negocio
Un filtro de productos según sus atributos You're Reading a Preview
Unlock full access with a free trial. La búsqueda de productos por nombre
Ver detalle del producto
El login de sus vendedores
Añadir pedido
Modificar pedido
Eliminar pedido
Download With Free Trial
Sign up to vote on this title
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Upload
Sign In
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Magazines
News
Documents
Sheet Music
Proyecto - Martin - TICS
1
Download
Join
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
Necesidades de bases de datos : En este punto también puedes capturar las entidades, relaciones y atributos que requieren persistencia.
Para ello puedes usar varios artefactos. Dos de los más populares son: diagra entidad-relación y un diccionario de datos .
El uso de ambos lo defino muy bien en mi ebook “8 Pasos para diseñar tus ba de datos”. En él verás estrategias para capturar dichas necesidades. Ahora bien: En el estado actual, App Products solo tiene la entidad Producto. ¿Qué propiedades posee?
Código
Nombre
Descripción
Marca
Precio
You're Reading a Preview Unlock full access with a free trial.
Download With Free Trial
Unidades en stock
Imagen(es) de producto
Sign up to vote on this title
Paso #3. Determinar Quién Usará La Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Upload
Sign In
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Magazines
News
Documents
Sheet Music
Proyecto - Martin - TICS
1
Download
Join
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
O tal vez un panel de administración que muestre el resumen de las ventas y productividad de los empleados.
Paso #4. Crear Bocetos
A continuación vamos a crear mocks de la aplicación según nuestra experien con los patrones de diseño en Android. ¿Qué herramientas puedes usar?
Papel + Lapiz + Cámara para capturas
Ninjamock
Pothoshop
Mockplus
balsamiq
Pidoco
Lucidchart
Proto.io
You're Reading a Preview Unlock full access with a free trial.
Download With Free Trial
¿Cuál de todas elegir? Sign up to vote on this title
En mi caso me gusta mucho ninjamock porque es muy intuitiva de u Useful y Not useful gratuita Además permite una fácil comunicación con clientes que tengan algún conocimiento de desarrollo.
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks Magazines
News
Documents
Sheet Music
copia de un gran trabajo
Save
Embed
Share
Print
Download
Join
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
You're Reading a Preview full access with a free trial. Y basada en ella, estos son los Unlock puntos de interacción del usuario:
Free Trial Tap en botón “búsqueda” > AbreDownload pantallaWith de búsqueda
Sign up to vote on this title
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks Magazines
News
Documents
Sheet Music
copia de un gran trabajo
Save
Embed
Share
Print
Download
Join
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
You're Reading a Preview full access with a free trial. Tap en producto > Abre pantallaUnlock de detalle
Download With Free Trial
Sign up to vote on this title
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks Magazines
News
Documents
Sheet Music
copia de un gran trabajo
Save
Embed
Share
Print
Download
Join
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
Long tap en producto > Ripple Effect + Aparición de Contextual Action Bar (opcional)
You're Reading a Preview Unlock full access with a free trial.
Download With Free Trial
Swipe to refresh > Refrescar
Sign up to vote on this title
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks Magazines
News
Documents
Sheet Music
copia de un gran trabajo
Save
Embed
Share
Print
Download
Join
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
You're Reading a Preview Unlock full access with a free trial. Endless scroll > Se cargan elementos adicionales a la lista
Download With Free Trial
Sign up to vote on this title
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
Join
copia de un gran trabajo
Save
Embed
Share
Print
Download
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
Magazines
News
Documents
También anotemos los estados adversos:
Sheet Music
Estado sin productos > Mensaje de ausencia de productos
You're Reading a Preview Unlock full access with a free trial.
Download With Free Trial
Estado de error > Toast con mensajes de error
Sign up to vote on this title
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Upload
Sign In
Join
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Download
Magazines
News
Documents
Sheet Music
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
You're Reading a Preview Unlock full access with a free trial.
Paso #5. Determinar Fuentes De Datos Estrategias De Sincronización Download With Free Trial
Ojo aquí:
Debes definir muy bien qué pasará con la información de tus usuarios. Sign up to vote on this title
Unas buenas preguntas que te propongo a responder son: Useful Not useful “¿En qué lugares se guardarán datos? ”
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Upload
Sign In
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks Magazines
News
Documents
Sheet Music
copia de un gran trabajo
Save
Embed
Share
Print
Proyecto - Martin - TICS
1
Download
Join
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
Productos: predominan los cambios del servidor, ya que desde el client Android no se modificarán.
Además:
El usuario sincronizará manualmente la app con el gesto “Swipe to refr
Se enviarán modificaciones inmediatamente la persistencia local camb (futuro) Se notificarán cambios del servidor con notificaciones push (futuro) Si no hay conexión disponible para sincronizar, se programará una actualización a penas se detecte el restablecimiento de la red (futuro).
¿Qué políticas usarás para tomar datos? R/
You're Reading a Preview
Se consultará al servidor remoto por defecto cuando no haya datos en Unlock full access with a free trial. base de datos local.
Download With Free Trial Luego de obtener datos de la nube, la fuente de datos local se actualiza dichos datos. Luego se pone en la caché y se muestra en la vista.
Paso #6. Elegir Recursos Y Herramien ¿Cómo llevas tu diagnostico hasta aquí?
Sign up to vote on this title
Useful Not Al llegar a este punto, debes tener definido al menos un 70% deuseful lo que hará tu
Con todo y lo anterior… ¿Qué tal si definimos las herramientas, recursos y
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Upload
Sign In
Join
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Magazines
News
Documents
Sheet Music
Proyecto - Martin - TICS
1
Download
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
Ejecutor de peticiones HTTP hacia la API: Retrofit
Ahora, el lado del servidor:
Lenguaje: PHP 5.6
Gestor de bases de datos: MySQL
Proveedor del servicio de hosting: Localhost (nuestro PC local).
En el nivel #2 consideraremos usar opciones como: Google Cloud Platf Amazon web services, Rackspace, DigitalOcean, Microsoft Azure, Hero
Formato de intercambio: JSON
Paso #7. Crear Cascarón ¡Por fin! You're Reading a Preview Nos ha llegado el momento de codificar. Unlock full access with a free trial.
En esta etapa crearemos una primera entrega a la que yo llamo el “cascarón”
¿Por qué este nombre?
Download With Free Trial
La razón es sencilla: validar lo más pronto posible tu app.
Te olvidarás por un momento de las fuentes de datos y te centrará en crear un que solo utilice información falsa.
y fluj Harás que tu usuario pruebe de forma temprana todas las interacciones Sign up to vote on this title modo que obtengas el restante de opiniones quesolo se dan enuseful la acción rea Useful Not
Esto nos lleva a los siguientes pasos:
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Upload
Sign In
Join
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Magazines
News
Documents
Sheet Music
Proyecto - Martin - TICS
1
Download
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
Arquitectura y patrones
La arquitectura que usaremos se llama Clean, tratada en este artículo de Rob Martin. ¿Sus pros?
Permite separar conceptos
Aumenta la hermeticidad a la hora de usar tests
Reduce la dependencia de entes externos (bases de datos, APIs, senso etc)
La UI se somete solo a mostrar datos (nada de “God Activities”)
Muchas, muchas, muchas más…
You're Reading a Preview Clean architecture se divide en tres capas: Unlock full access with a free trial.
Presentación: Aquí defines todo lo relacionado a la vista y las animacio Modelo-Vista-Presentador En nuestro caso aplicaremos para cubrir dic Download With Free Trial capa. Sin embargo puedes usar MVC o MVVM. Dominio: Aquí van las reglas del negocio definidas por casos de uso (interactores) y las entidades básicas (objetos planos java).
Datos: Esta capa contiene los datos de la cual se alimentarán la capa d presentación. Existen varios patrones que puedes usar manejar lo Sign up to vote on para this title datos. En particular, usaremos uno llamado Useful Notpara useful generaliza Repositorio toma desde múltiples fuentes de datos (SQLite, Realm, Memoria, Servid archivos, etc.).
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Upload
Sign In
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Download
Magazines
News
Documents
Sheet Music
Join
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
¿Qué te parece? ¿Ya la conocías?
Generalmente se habla de usar MVP como arquitectura. Sin embargo este es un patrón para simplificar la capa de presentación. Este artículo de Antonio Leiva te aclarará muy bien esta parte: http://www.genbetadev.com/paradigmas-de-programacion/usando-mvp-einversion-de-dependencias-para-abstraernos-del-framework-en-android
Cabe destacar que reduciré la cantidad de elementos You're Reading a Preview usados en esta arquitec con el fin de no abrumarte en esta primera construcción. Unlock full access with a free trial.
Lo importante es que elijas una forma de escribir tu código que sea entendibl Download With Free Trial ti y futuros lectores de tu proyecto. Además que puedas ejecutar tests herméticos.
Tareas de programación
a ca A continuación, debes recopilar en orden las tareas que tienes que llevar Sign up to vote on this title forma incremental, hasta que hayas terminado tuapp. Useful Not useful
La prioridad con que elijas las tareas depende de tu contexto productivo.
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
Join
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
1
Download
Magazines
News
Documents
Sheet Music
Proyecto - Martin - TICS
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
De la otra mano…
… veamos como planificaremos el orden de tareas en App Productos.
Tareas de programación para App Products 1. Crear actividad de productos (clase Java + layout) 2. Crear fragmento de productos (clase Java + layout) a. Crear entidad Producto b. Crear adaptador de productos c. Crear layout para ítems de productos 3. Preparar fragmento 4. Crear contrato MVP 5. Implementar “vista” de productos You're Reading a Preview Unlock full access with a free trial.
6. Implementar “presentador” de productos
Download With Free Trial
7. Crear repositorio de productos 8. Crear fuentes de datos
9. Terminar presentador de productos 10. Establecer dependencias vista-presentador Sign up to vote on this title
11. Proveer Endless scroll
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Magazines
News
Documents
Sheet Music
Proyecto - Martin - TICS
1
Download
Join
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
Así:
Nombre del paquete: “com.hermosprogramacion.premium.appproduct
SDK mínimo: “11”
Actividad por defecto: “Basic Activity”
Nombre actividad: “ProductsActivity”
Paquetes Java Antes que nada, organicemos la estructura de paquetes Java basados en la arquitectura propuesta.
You're Reading a Preview Unlock full access with a free trial.
Download With Free Trial
Veamos el propósito de cada uno:
Sign up to on this Representa lavote capa detitle datos.
data
Useful
Not useful
En el tendremos el manejador de l y el repositorio y fuentes de
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Upload
Sign In
Join
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
1
Download
Magazines
News
Documents
Sheet Music
Proyecto - Martin - TICS
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
(domain) y los componentes presentación (MVP).
Lo siguiente es diseñar su interfaz. Layout: Por defecto Android Studio te creó el layout activity_products.xml.
En su interior verás la AppBar junto a una etiqueta
que representa e contenido principal. Y un floating action button. Debido a que no lo necesitamos, elimínalo.
activity_products.xml
xmlns:android ="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" You're Reading a Preview xmlns:tools="http://schemas.android.com/tools" android :layout_width="match_parent" Unlock full access with a free trial. android :layout_height="match_parent" android :fitsSystemWindows="true" tools:context=".products.ProductsActivity" Download With Free>Trial
android :layout_width="match_parent" android :layout_height="wrap_content" android :theme="@style/AppTheme.AppBarOverlay" >
android :id="@+id/toolbar" android :layout_width="match_parent" android :layout_height="?attr/actionBarSize" Sign up to vote on this title android :background="?attr/colorPrimary" Useful Not app:popupTheme="@style/AppTheme.PopupOverlay" /> useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Download
Magazines
News
Documents
Sheet Music
Join
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
Como vamos a instalar un fragmento en la actividad, asigna al layout el id products_container.
content_products.xml
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android :id="@+id/products_container" android :layout_width="match_parent" android :layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context=".products.ProductsActivity" tools:showIn="@layout/activity_products" >
Lógica de la actividad Esta parte va ya es conocida por ti. Lo único que hará nuestra actividad será agregar un fragmento. You're Reading a Preview
del FragmentManager. Usa una transacción tipo “añadir” Unlock full access with a free trial.
Recuerda que el lugar para hacerlo es onCreate(). Download With Free Trial ProductsActivity.java public class ProductsActivity extends AppCompatActivity { private Toolbar mToolbar; private Fragment mProductsFragment; @Override
Sign up to vote on this title
Useful
Not useful
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Upload
Sign In
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Magazines
News
Documents
Sheet Music
Proyecto - Martin - TICS
1
Download
Join
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
}
private void setUpProductsFragment() { if ( mProductsFragment == null) { mProductsFragment = ProductsFragment.newInstance(null, null); getSupportFragmentManager() .beginTransaction() .add(R.id. products_container , mProductsFragment) .commit(); } } @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is pr getMenuInflater().inflate(R.menu. menu_products , menu); return true; } @Override
public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } You're Reading a Preview
return super.onOptionsItemSelected(item); Unlock full access with a free trial. } }
Download With Free Trial
Obviamente el fragmento aún no está creado… …pero eso se soluciona ejecutando la tarea #2. Sign up to vote on this title
Tarea #2. Crear fragmento de productos Useful Not useful A continuación, da click derecho en el paquete products
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks Magazines
News
Documents
Sheet Music
copia de un gran trabajo
Save
Embed
Share
Print
Download
Join
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
You're Reading a Preview Unlock full access with a free trial.
Download With Free Trial
Sign up to vote on this title
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Download
Magazines
News
Documents
Sheet Music
Join
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
fragment_products.xml
Llegó la hora de representar los bocetos que realizaste de la pantalla de produ Recuerda:
Tenemos una lista de productos como el view principal. Pero también existen dos estados: carga y ausencia de ítems. ¿Qué views usar? Veamos…
La lista de productos : Tenemos dos opciones. ListView y RecyclerView.
Puedes usar cualquiera, pero como la mayoría de mis lectores me piden tutor sobre el segundo, entonces ese será nuestro objetivo. Observa:
#1. Abre fragment_products.xml y establece como nodo raíz un RelativeLayo You're Reading a Preview Unlock full access with a free trial.
Download With Free Trial android :id="@+id/products_content" android :layout_width="match_parent" android :layout_height="match_parent" >
#2. Abre tú archivo build.gradle, agrega la siguiente dependencia y sincroniza Files): proyecto (Tools > Android > Sync Project with Gradle Sign up to vote on this title dependencies {
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Proyecto - Martin - TICS
1
Download
Magazines
News
Documents
Sheet Music
Join
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
android :background="#F0F0F0" android :scrollbars="vertical" app:layoutManager="LinearLayoutManager" />
Estado de carga: Ya sabemos que para refrescar los productos, usaremos el p “Swipe to refresh”.
Y la solución es la clase SwipeRefreshLayout.
La única acción que debes realizar es envolver el RelativeLayout con la etique android.support.v4.widget.SwipeRefreshLayout y listo:
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 :id="@+id/refresh_layout" android :layout_width="match_parent" android :layout_height="match_parent" tools:context=".products.ProductsFragment" >
...
You're Reading a Preview Unlock full access with a free trial.
Estado vacío: Cuando no tengamos productos en la aplicación, mostraremos mensaje al usuario. Download With Free Trial
¿Cómo hacerlo? Bueno, depende de tu imaginación. Pero un icono alusivo al “vacío” y un mensaje claro basta. TextView Así que usemos un LinearLayout vertical, con un ImageView y on unthis . Sign up to vote title
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
Join
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
1
Download
Magazines
News
Documents
Sheet Music
Proyecto - Martin - TICS
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
android :tint="@android:color/darker_gray" app:srcCompat="@drawable/ic_package_variant_closed" />
android :id="@+id/noProductsText" android :layout_width="wrap_content" android :layout_height="wrap_content" android :layout_gravity="center" android :layout_marginBottom="@dimen/list_item_padding" android :text="@string/no_products_message" />
Si te fijas en la preview verás lo siguiente:
You're Reading a Preview Unlock full access with a free trial.
Download With Free Trial
Sign up to vote on this title
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Download
Magazines
News
Documents
Sheet Music
Join
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
Crear entidad Producto
Ya sabemos que atributos usaremos para los productos (visita el paso #2 si n recuerdas).
Ahora solo queda crear un objeto Java tradicional que represente la entidad d negocio. Añade una nueva clase llamada Product dentro de products/domain/model public class Product { private private private private private private private
String mCode; String mName; String mDescription ; String mBrand ; float mPrice; int mUnitsInStock ; String mImageUrl ;
public Product(float price, String name, String imageUrl) { mCode = UUID.randomUUID ().toString(); mPrice = price; mName = name; mImageUrl = imageUrl; }
You're Reading a Preview
public String getCode() { return mCode; Unlock full access with a free trial. }
public String getName() { Download With Free Trial return mName; }
public String getDescription() { return mDescription; }
public String getBrand() { return mBrand ; }
public float getPrice() { return mPrice; }
Sign up to vote on this title
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Upload
Sign In
Join
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Download
Magazines
News
Documents
Sheet Music
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
}
public void setDescription(String mDescription) { this. mDescription = mDescription; }
public void setBrand(String mBrand) { this. mBrand = mBrand; }
public void setPrice(float mPrice) { this. mPrice = mPrice; }
public void setUnitsInStock( int mUnitsInStock) { this. mUnitsInStock = mUnitsInStock; }
public void setImageUrl(String mImageUrl) { this. mImageUrl = mImageUrl; }
public String getFormatedPrice() { return String.format("$%s", mPrice); }
public String getFormattedUnitsInStock() { return String.format(Locale.getDefault(), "%d u.", mUnitsInStock }
You're Reading a Preview
}
Unlock full access with a free trial.
Crear adaptador de productos Download With Free Trial La lista no está completa si no tenemos un adaptador alimentándola. Por eso, crea una nueva clase Java (File > New > Java Class) y llámala ProductsAdapter. Por si lo haz olvidado: Sign up to vote on this title
Extiende la clase de RecyclerView.Adapter Useful Not useful
Declara como variable miembro una lista de objetos Product
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Upload
Sign In
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Magazines
News
Documents
Sheet Music
Proyecto - Martin - TICS
1
Download
Join
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
Crea una clase anidada que herede de RecyclerView.ViewHolder para referenciar los views de los productos.
¿La has pillado? ¡Bien! La implementación debería quedarte así: public class ProductsAdapter extends RecyclerView.Adapter {
private List mProducts; private ProductItemListener mItemListener;
public ProductsAdapter(List products, ProductItemListener itemListener) { setList(products); mItemListener = itemListener; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, viewType) { You're Reading a Preview Context context = parent.getContext(); LayoutInflater inflater = LayoutInflater. from(context); Unlock full access with a free trial. View view;
Download With Free Trial view = inflater.inflate(R.layout. item_product , parent, false); return new ProductsHolder(view, mItemListener); } @Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
if (viewHolder instanceof ProductsHolder) { Product product = mProducts.get(position);
Sign up to vote on thisviewHolder; title ProductsHolder productsHolder = (ProductsHolder) price.setText(product.getFormatedPrice()); productsHolder. Useful Not useful productsHolder.name.setText(product.getName());
productsHolder. unitsInStock.setText(product.getFormattedUnitsInStock());
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Proyecto - Martin - TICS
1
Download
Magazines
News
Documents
Sheet Music
Join
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
private void setList(List notes) { mProducts = checkNotNull(notes); }
public void addData(List products) { mProducts.addAll(products); } @Override
public int getItemCount() { return getDataItemCount(); }
public Product getItem(int position) { return mProducts.get(position); }
public int getDataItemCount() { return mProducts.size(); }
public class ProductsHolder extends RecyclerView.ViewHolder implements View.OnClickListener { public public public public
TextView name; TextView price; ImageView featuredImage; TextView unitsInStock ; You're Reading a Preview
private ProductItemListener mItemListener ; Unlock full access with a free trial.
public ProductsHolder(View itemView, ProductItemListener listener) super(itemView); Download With Free Trial mItemListener = listener; name = (TextView) itemView.findViewById(R.id. product_name ); price = (TextView) itemView.findViewById(R.id. product_price); unitsInStock = (TextView) itemView.findViewById(R.id. units_in_stock ); featuredImage = (ImageView) itemView.findViewById(R.id. product_featured_image); itemView.setOnClickListener( this); }
Sign up to vote on this title
@Override
public void onClick(View v) { int position = getAdapterPosition(); Product product = getItem(position);
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
Join
copia de un gran trabajo
Save
Embed
Share
Print
Download
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
Magazines
News
Documents
Aspectos a resaltar:
Sheet Music
Usamos la librería Glide para cargar la imagen del producto desde la url. Recu incluir esta dependencia para llevarla a cabo: compile 'com.github.bumptech.glide:glide:3.7.0'
replaceData() renueva
todos los datos del adaptador, pero addData() agrega s
los ya existentes.
¿Ves que en onBindViewHolder() uso el layout item_product.xml? Obviamente, ya que te estará marcando error. Mantente conmigo para ver cómo crear el diseño…
Crear layout de ítems
You're Reading a Preview Unlock full access with a free trial.
Párate en el directorio res/layout, haz click derecho y selecciona New > Layou Download With Free Trial resource file.
Sign up to vote on this title
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Magazines
News
Documents
Sheet Music
Proyecto - Martin - TICS
1
Download
Join
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
A mi parecer podemos usar un RelativeLayout. ¿Por qué? Flexibilidad.
Las posiciones que tienen los elementos exigen orientaciones con respecto a padre y a los hermanos. Siendo así. Los views tendrían estas características:
You're Reading a Preview
Nombre (TextView ): Alineado a la derecha Unlock full access with a freedel trial.padre y pegado a la imag producto. No debe superar 1 línea de texto. Download With Free Trial
Precio (TextView ): Alíneado en derecha + inferior.
Unidades en stock (TextView): Por debajo del nombre y pegado a la ima
Imagen del producto (ImageView ): Alineado a la izquierda del padre, tam de 72dp x 72dp Sign up to vote on this title
VITAL:
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
Join
copia de un gran trabajo
Save
Embed
Share
Print
Proyecto - Martin - TICS
1
Download
of 104
Magazines
News
Documents
item_product.xml
Sheet Music
Pool Conexiones
tap05_interfaces.ppt
Search document
xmlns:android ="http://schemas.android.com/apk/res/android" xmlns:card_view="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android :layout_width="match_parent" android :layout_height="wrap_content" android :layout_marginLeft="4dp" android :layout_marginRight="4dp" android :layout_marginTop="2dp" android :foreground="?attr/selectableItemBackgroundBorderless" card_view:cardPreventCornerOverlap="true" card_view:cardUseCompatPadding="true">
android :layout_width="match_parent" android :layout_height="match_parent" android :paddingBottom="8dp" android :paddingLeft="@dimen/activity_horizontal_margin" android :paddingRight="@dimen/activity_horizontal_margin" android :paddingTop="8dp">
android :id="@+id/product_featured_image" android :layout_width="72dp" android :layout_height="72dp" android :layout_alignParentLeft="true" You're Reading a Preview android :layout_marginRight="8dp" />
Unlock full access with a free trial.
android :id="@+id/product_name" android :layout_width="wrap_content" Download With Free Trial android :layout_height="wrap_content" android :layout_alignParentRight="true" android :layout_toRightOf="@+id/product_featured_image" android :maxLength="65" android :maxLines="1" android :text="New Text" android :textAppearance="@style/TextAppearance.AppCompat.Body2" android :textSize="16sp" tools:text="Piperacina Compuesta" />
Sign up to vote on this title
Useful android :id="@+id/product_price" android :layout_width="wrap_content" android :layout_height="wrap_content"
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
Join
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Download
Magazines
News
Documents
Sheet Music
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
android :textAppearance="@style/TextAppearance.AppCompat.Captio tools:text="20 u." />
Efecto Ripple: Si quieres que el efecto Ripple funcione sobre el ítem, usa la característica android:foreground del CardView para definirle el ripple por defe del framework ?attr/selectableItemBackgroundBorderless .
You're Reading a Preview Tarea #3. Preparar fragmento Unlock full access with a free trial.
El siguiente paso es que relaciones programáticamente los del layout. Para hacerlo, haz esto:
Download With Free Trial
Agrega variables miembros
Al inicio de ProductsFragment, agrega campo global llamado mProductsList par reciclador. Sign up to vote on this title
También agrega una para el adaptador llamada mProductsAdapter.
private RecyclerView mProductsList; private ProductsAdapter mProductsAdapter;
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Magazines
News
Documents
Proyecto - Martin - TICS
1
Download
Join
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
// Aquí lanzarías la pantalla de detalle del producto }
Sheet Music
};
Crea instancia del adaptador Ahora, en onCreate(), crea un nuevo adaptador. Pasa como parámetro la escucha y una nueva lista. Su capacidad inicial será 0, ya que aún no tenemos elementos. @Override
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mProductsAdapter = new ProductsAdapter( new ArrayList(0), mItemListener ); }
Obtén referencias UI You're Reading a Previewde la interfaz: Usa findViewById() y consigue todos los elementos Unlock full access with a free trial.
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, BundleDownload savedInstanceState) With Free Trial { View root = inflater.inflate(R.layout.fragment_products , container, // Referencias UI mProductsList = (RecyclerView) root.findViewById(R.id. products_list); mEmptyView = root.findViewById(R.id.noProducts ); mSwipeRefreshLayout = (SwipeRefreshLayout) root.findViewById(R.id. refresh_layout ); // Setup setUpProductsList(); setUptRefreshLayout();
return root; }
Sign up to vote on this title
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks Magazines
News
Documents
Sheet Music
copia de un gran trabajo
Save
Embed
Share
Print
Proyecto - Martin - TICS
1
Download
Join
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
Este método queda abierto para más configuraciones relacionadas a la lista.
Prepara el swipe to refresh
Si te parece, cambia el esquema de colores del indicador en SwipeRefreshLayo través del método SetColorSchemeColors() . Y añade una escucha para disparar acciones al detectar el gesto. private void setUptRefreshLayout() { mSwipeRefreshLayout.setColorSchemeColors(
ContextCompat.getColor (getActivity(), R.color.colorPrimary ), ContextCompat.getColor (getActivity(), R.color.colorAccent), ContextCompat.getColor (getActivity(), R.color.colorPrimaryDark
mSwipeRefreshLayout.setOnRefreshListener( new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { } }); }
You're Reading a Preview Tarea #4. Crear contrato MVP
Unlock full access with a free trial.
Por lo general para representar el patrón MVP, se requiere una interfaz por ca Download With Free Trial elemento: modelo, vista y presentador. Esto permite vincular la triada de forma desconectada a los componentes particulares. Y queda mucho mejor si podemos tener sus definiciones en una interfaz de contrato. Entonces.
Sign up to vote on this title
Useful
Not useful
Crea una interfaz nueva yendo a New > Java Class : Interface. Denomínala co
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Download
Magazines
News
Documents
Sheet Music
Join
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
Como te venía diciendo, incluimos dos interfaces para la vista y el presentado modelo lo supeditamos a la capa de datos. public interface ProductsMvp { interface View { }
interface Presenter { } }
Ahora,
Determina las acciones de la vista Pregúntate: ¿Qué debe mostrar la vista? Si tomas el camino feliz, dirás “una lista de productos” . ¡Y es correcto!
You're Reading a Preview
Unlock full access with a free trial. La vista debe tener un método para ello.
Download With Free Trial
Sign up to vote on this title
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks Magazines
News
Documents
Sheet Music
copia de un gran trabajo
Save
Embed
Share
Print
Download
Join
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
You're Reading a Preview Unlock full access with a free trial.
Download With Free Trial
Incluyámoslo en la interfaz View con la firma showProducts(List) (“m productos”). Sign up to vote on this title
void showProducts(List products);
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks Magazines
News
Documents
Sheet Music
copia de un gran trabajo
Save
Embed
Share
Print
Download
Join
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
You're Reading a Preview Unlock full access with a free trial.
Download With Free Trial
En este caso debes crear un método que inicie/termine la carga en la vista.
up to vote on this title de carga? Una buena firma sería showLoadingState(boolean) Sign (“¿mostrar estado
void showLoadingState( boolean show);
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Upload
Sign In
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks Magazines
News
Documents
Sheet Music
copia de un gran trabajo
Save
Embed
Share
Print
Download
Join
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
You're Reading a Preview Unlock full access with a free trial.
Download With Free Trial
void showEmptyState(); Sign up to vote on this title
Y para mostrar un error: showProductsError(String) .Useful Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks Magazines
News
Documents
Sheet Music
copia de un gran trabajo
Save
Embed
Share
Print
Download
Join
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
You're Reading a Preview Unlock full access with a free trial.
Download With Free Trial
void showProductsError(String msg);
El páginado con Endless Scroll
Sign up to vote on this title
Useful
Not useful
La vista de un páginado se trata de agregar más elementos a la lista cada vez
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Upload
Sign In
Join
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Download
Magazines
News
Documents
Sheet Music
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
Al mismo tiempo, debemos evitar que se genere el indicador si ya no hay más datos. Por lo que un método que nos ayude a encender/apagar dicha condició vendría bien: void allowMoreData( boolean show);
Determina las acciones del presentador Este quehacer es fácil.
El presentador solo debe recuperar los datos del repositorio y los pone en la v Así que “cargar productos” sería una excelente firma para su método. interface Presenter { void loadProducts( boolean reload); }
Por ahora este es su única acción.
Pero cabe resaltar que la carga puede ser para refrescar el contenido. Así que You're Reading a Preview el parámetro booleano reload para especificarlo. Unlock full access with a free trial.
El presentador también debe afectar el modelo para guardar, modificar y elim datos. Pero en este tutorial no loDownload requerimos aún.Trial With Free
Tarea #5. Implementar Vista de productos ¿Quién es la implementación concreta de la vista? El fragmento de productos. Sign up to vote on this title
El será el que manipule los views existentes paradarle Usefulvida Notflujo usefulde interfaz al Teniendo en cuenta esto, prosigamos de la siguiente manera.
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Upload
Sign In
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks Magazines
News
Documents
copia de un gran trabajo
Save
Embed
Share
Print
Download
Join
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
@Override
public void showProducts(List products) {
Sheet Music
} @Override
public void showLoadingState( final boolean show) { } @Override
public void showEmptyState() { } @Override
public void showProductsError(String msg) { } @Override
public void showProductsPage(List products) { } @Override
public void showLoadMoreIndicator( boolean show) { } @Override
You're Reading a Preview
public void allowMoreData( boolean { a free trial. Unlockallow) full access with }
Download With Free Trial
Sobrescribe ShowProducts()
Lo primero es reemplazar los datos del adaptador (replaceData()) y luego mo la lista (setVisibility(View.VISIBLE)) y ocultar el estado de vacío (setVisibility(View.GONE ). @Override
Sign up to vote on this title public void showProducts(List products) { Useful Not useful
mProductsAdapter.replaceData(products);
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Magazines
News
Documents
Sheet Music
Proyecto - Martin - TICS
1
Download
Join
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
Y luego usa el método setRefreshing() con el parámetro booleano show de showLoadingState().
Para asegurarte que no se sobreponen las llamadas, pon en cola el mensaje c post(). @Override
public void showLoadingState( final boolean show) { if (getView() == null) { return; }
mSwipeRefreshLayout.post(new Runnable() { @Override
public void run() { mSwipeRefreshLayout.setRefreshing(show); } }); }
Sobrescribe showEmptyState() Este método es intuitivo. Reading a Preview Solo haz aparecer el view vacío You're y oculta la lista. @Override
Unlock full access with a free trial.
public void showEmptyState() { mProductsList.setVisibility(View. GONE );Free Trial Download With mEmptyView.setVisibility(View. VISIBLE ); }
Sobrescribe showProductsError()
Cuando vengan los errores desde el presentador es buena opción mostrarlos Sign up to vote on this title un Toast.
El código es fácil:
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
Join
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Download
Magazines
News
Documents
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
mProductsAdapter.addData(products); }
Sheet Music
showLoadMoreIndicator() y allowMoreData() los
veremos más adelante.
Tarea #6. Implementar el Presentador de product Llegando hasta este punto ya tenemos la UI resplandeciente. Pero claro… …faltan los datos
¿Cómo obtenerlos?
De la capa de presentación debemos usar una interfaz que nos permita solici información a la capa de dominio.
Dicha interfaz puede ser un Interactor (caso de uso). Un elemento que sigue e patrón Command. Readingpor a Preview Sin embargo, no crearemos esteYou're elemento el momento. Unlock full access with a free trial.
No quiero que realizar este tutorial sea duro para ti. Entonces, ¿Qué haremos?
Download With Free Trial
Comunicaremos directamente el presentador con el repositorio de productos siguiente manera…
Crear presentador
Sign up to vote on this title ProductsPresenter Añade una nueva clase al paquete products llamada .
Useful
Esta será la implementación concreta del componente.
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
Join
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Download
Magazines
News
Documents
Sheet Music
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
}
Genera un constructor Lo primero que pondrás será un constructor. ¿Qué parámetros debe recibir?
Recuerda la triada. El presentador lleva y trae entre la vista y el modelo. Así que ambos son requeridos para el funcionamiento natural de este. private final ProductsRepository mProductsRepository; private final ProductsMvp.View mProductsView; public ProductsPresenter(ProductsRepository productsRepository, ProductsMvp.View productsView) { mProductsRepository = checkNotNull(productsRepository); mProductsView = checkNotNull(productsView); }
You're Reading a Preview
ProductsRepository. Por ahora déj (En el otro paso crearemos el componente Unlock full access with a free trial. expresado)
Download With Free Trial
Sobrescribe loadProducts() ¿Cómo funciona la carga de productos? Dejame resumirlo en este diagrama de flujo: Sign up to vote on this title
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Upload
Sign In
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks Magazines
News
Documents
Sheet Music
copia de un gran trabajo
Save
Embed
Share
Print
Download
Join
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
You're Reading a Preview Unlock full access with a free trial.
Download With Free Trial
Sign up to vote on this title
El concepto de primera carga se relaciona con elinicio la Not aplicación. Usefulde useful
Al iniciar, no habrá datos. Por lo que tendremos una bandera booleana que lle
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Download
Magazines
News
Documents
Sheet Music
Join
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
En código esta lógica sería así: @Override
public void loadProducts(final boolean reload) { final boolean reallyReload = reload || isFirstLoad ; if (reallyReload) { mProductsView.showLoadingState( true); mProductsRepository.refreshProducts(); mCurrentPage = 1; } else { mProductsView.showLoadMoreIndicator( true); mCurrentPage ++; }
mProductsRepository.getProducts(..); }
Tarea #7. Crear repositorio de productos
La comunicación directa desde la capa de datos hacia el presentador requiere interfaz asociada al repositorio. You're Reading a Preview
¿Qué comportamientos debe tener?
Unlock full access with a free trial.
Simplemente obtener productos
Download With Free Trial
De la otra mano tenemos que esta operación tiene probabilidad de ejecutarse indefinidamente (latencia de red, lectura en disco, cantidad de elementos, etc Así que para saber como resulta (éxito, fallo o proceso), es buena idea crear interfaces para capturar estos eventos. ¿Todo claro hasta allí? Veamos el código…
Sign up to vote on this title
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
Join
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Download
Magazines
News
Documents
Sheet Music
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
void getProducts(GetProductsCallback callback); void refreshProducts(); }
GetProductsCallback procesa
el flujo exitoso (onProductsLoaded()) y fallido (onProductsLoadError()) de la carga de productos.
Crear implementación del repositorio ¿Qué hacemos en esta parte? Ya puedes intuir que crearás una clase llamada ProductsRepository e implementarás la interfaz anterior. public class ProductsRepository implements IProductsRepository {
Lo siguiente es poner como elementos miembros las fuentes de datos de me y nube (en breves minutos las crearemos). También el contexto donde lo usaremos y una bandera para saber si hay que You're Reading a Preview refrescar los datos. Unlock full access with a free trial.
private final IMemoryProductsDataSource mMemoryProductsDataSource; private final ICloudProductsDataSource mCloudProductsDataSource; private final Context mContext;Download With Free Trial private boolean mReload ;
Ahora, crea un constructor que reciba instancias de las fuentes de datos. (Usa el método Preconditions.checkNotNull() de Guava para comprobar su contenido) Sign up to vote on this title
Useful
Not useful
public ProductsRepository(IMemoryProductsDataSource memoryDataSource, ICloudProductsDataSource cloudDataSource, Context context) {
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Upload
Sign In
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
Join
copia de un gran trabajo
Save
Embed
Share
Print
Proyecto - Martin - TICS
1
Download
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
Magazines
News
Documents
¿Cuáles son las reglas para tomar una fuente de datos u otra?
Sheet Music
Para este ejemplo dijimos que los productos tienen un rol “esclavo”, es decir, app solo serán consultados. El usuario no podrá crear, modificar o eliminar productos. Eso nos lleva a establecer que...
“Si hay datos en memoria y no se ordenó una recarga, se mostrarán directam
sin consultar al servidor. Si es una recarga, entonces pedir datos al servidor
Implementar políticas Hay varias formas de hacer esto. La que usaremos se basa en incluir la lógica en cada método del repositorio.
Pero por otro lado Fernando Cejas nos muestra cómo usar un patrón Factory elegir la fuente de datos aisladamente: Ejemplo Factory para fuentes de datos
You're Reading a Preview
Basado en lo que dijimos ahoraUnlock el algoritmo se traduce a: full access with a free trial. @Override
Download With Free Trialcallback) { public void getProducts( final GetProductsCallback if (! mMemoryProductsDataSource.mapIsNull() && !mReload ) { getProductsFromMemory(callback); return; }
if ( mReload ) { getProductsFromServer(callback, criteria); } else { List products = mMemoryProductsDataSource .find(); Sign up to vote on this title if (products.size() > 0) { Useful Not useful callback.onProductsLoaded(products); } else { getProductsFromServer(callback);
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
Join
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Download
Magazines
News
Documents
Sheet Music
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
Tarea #8. Crear Fuentes De Datos Crear fuente de datos en memoria Lo primero es generar una interfaz hacia el repositorio llamada IMemoryProductsDataSource en data/products/datasource/memory. ¿Qué operaciones tendremos?
Obtención (find())
Guardado (save())
Eliminación de todos los registros ( deleteAll())
Comprobación de existencia de datos (mapIsNull())
Interpretando lo anterior, escribe el siguiente código: public interface IMemoryProductsDataSource { List find(ProductCriteria criteria);
You're Reading a Preview
void save(Product product);
Unlock full access with a free trial.
void deleteAll(); boolean mapIsNull();
Download With Free Trial
}
Ahora en el mismo paquete, crea una nueva clase llamada MemoryProductsDataSource e implementa la interfaz anterior.
public class MemoryProductsDataSource implements IMemoryProductsDataSource Sign up to vote on this title
Declara como miembro un HashMap
Useful
Product> para
Not useful
almacenar
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Download
Magazines
News
Documents
Sheet Music
Join
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
} @Override
public void save(Product product) { if (mCachedProducts == null) { mCachedProducts = new LinkedHashMap<>(); } mCachedProducts.put(product.getCode(), product); }
@Override
public void deleteAll() { if (mCachedProducts == null) { mCachedProducts = new LinkedHashMap<>(); } mCachedProducts.clear(); }
@Override
public boolean mapIsNull() { return mCachedProducts == null; }
Crear fuente de datos en la nube (falsa) You're Reading a Preview
Digo “falsa” porque aún no tendrá datos reales. La crearemos luego de haber Unlock full access with a free trial. desarrollado nuestro servicio web (REST API).
Continuando:
Download With Free Trial
Al igual que hicimos para la fuente en memoria, crea una interfaz llamada ICloudProductsDataSource dentro de data/products/datasource/cloud. En esta las acciones son más limitadas.
Solo obtendremos productos (getProducts()) y proporcionaremos callbacks p Sign up to vote on this title saber el resultado de la petición (ProductServiceCallback).
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Upload
Sign In
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks Magazines
News
Documents
Sheet Music
copia de un gran trabajo
Save
Embed
Share
Print
Proyecto - Martin - TICS
1
Download
Join
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
Lo siguiente es crear una clase llamada CloudProductsDataSource con la interfa fuentes.
public class CloudProductsDataSource implements ICloudProductsDataSource {
Ahora pon como miembro un HashMap
Product> como
hicimos en la fu
(Agrega algunos datos de prueba para verlos en la interfaz)
private static HashMap API_DATA ; static { API_DATA = new LinkedHashMap<>(); for (int i = 0; i < 100; i++) { addProduct(43, "Producto " + (i + 1),
"file:///android_asset/mock-product.png" ); } }
You're Reading a Preview
Unlock full access with aString free trial. name, String imageUrl) private static void addProduct( float price, Product newProduct = new Product(price, name, imageUrl);
API_DATA .put(newProduct.getCode(), newProduct); }
Download With Free Trial
La imagen mock-product.png se encuentra en la carpeta main/assets. El es file:///android_asset se usa para referirnos a ese lugar. Sign up to vote on this title
El siguiente paso es implementar GetProducts(). Useful Not useful
Sería un poco más realista si simulamos con un Handler el tiempo de latencia
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Upload
Sign In
Join
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Proyecto - Martin - TICS
1
Download
Magazines
News
Documents
Sheet Music
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
Donde LATENCY es una constante para retrasar la simulación 2 segundos: private static final long LATENCY = 2000;
Completemos el repositorio ¡Ahora sí! Usemos las fuentes de datos en el repositorio teniendo en cuenta la política definida: private void getProductsFromMemory(GetProductsCallback callback) { callback.onProductsLoaded( mMemoryProductsDataSource.find()); }
private void getProductsFromServer( final GetProductsCallback callback) { if (!isOnline()) { callback.onDataNotAvailable( "No hay conexión de red."); return; }
You're Reading a Preview
mCloudProductsDataSource.getProducts( Unlock full access with a free trial. new ICloudProductsDataSource.ProductServiceCallback() { @Override
public void onLoaded(List products) {
Download With Free Trial refreshMemoryDataSource(products); getProductsFromMemory(callback);
} @Override
public void onError(String error) { callback.onDataNotAvailable(error); } }); }
Sign up to vote on this title
Useful Not useful ConnectivityManager cm = (ConnectivityManager) mContext.getSystemService(Context. CONNECTIVITY_SERVICE );
private boolean isOnline() {
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
Join
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
1
Download
Magazines
News
Documents
Sheet Music
Proyecto - Martin - TICS
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
Fijate que cuando se termina la carga de productos desde el servidor, la fuent datos en memoria se refresca con resfreshMemoryDataSource(). Solo se trata de la eliminación completa del contenido actual y el guardado posterior de los elementos. Recuerda comprobar si dispones de conexión antes de ejecutar la toma de productos desde la nube (isOnline()).
Tarea #9. Terminar presentador de productos Vuelve al presentador de productos para implementar loadProducts(). La idea es llamar a GetProducts
().
¿Qué debes hacer en los casos de retorno? Echale un ojo al diagrama de flujo (haz zoom para verlo en detalle): You're Reading a Preview
INICIO
Unlock full access with a free trial. TRUE
Download With Free Trial
¿Carga exitosa?
FALSE
Ocultar indicad
Ocultar indicador
FALSE
TRUE
¿Hay productos ? Mostrar
Sign up to vote on this title
TRUE
FALSE ¿Refresco?
TRUE
Useful
Not useful FALSE
¿Refresco?
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
Join
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Proyecto - Martin - TICS
1
Download
Magazines
News
Documents
¿Copiado?
Sheet Music
¡Excelente!
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
Observa: mProductsRepository.getProducts( new ProductsRepository.GetProductsCallback() { @Override public void onProductsLoaded(List products) { mProductsView .showLoadingState( false); processProducts(products, reallyReload); // Ahora si, ya no es el primer refresco isFirstLoad = false; } @Override
public void onDataNotAvailable(String error) { mProductsView .showLoadingState( false); mProductsView .showLoadMoreIndicator( false); mProductsView .showProductsError(error); } });
Donde processProducts() bifurcaYou're los resultados así: Reading a Preview private void processProducts(List Unlock full access withproducts, a free trial. boolean reload) { if (products.isEmpty()) { if (reload) { Download With Free Trial mProductsView.showEmptyState(); } else { mProductsView.showLoadMoreIndicator( false); }
mProductsView.allowMoreData(false); } else { if (reload) { mProductsView.showProducts(products); } else { mProductsView.showLoadMoreIndicator( false Sign up to); vote on this title mProductsView.showProductsPage(products); Useful Not useful }
mProductsView.allowMoreData(true);
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Upload
Sign In
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Magazines
News
Documents
Sheet Music
Proyecto - Martin - TICS
1
Download
Join
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
En consecuencia, ve al fragmento y crea un miembro presentador. private ProductsPresenter mProductsPresenter;
Luego en onActivityCreated(), inicia su instancia. @Override
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mProductsAdapter = new ProductsAdapter( new ArrayList(0), mItemListener ); mProductsPresenter = new ProductsPresenter( DependencyProvider. provideProductsRepository (getActivity()), this); setRetainInstance( true); }
¿Cuál es la razón para obtener el repositorio desde el proveedor externo DependencyProvider? La respuesta concreta:
Para eliminar la responsabilidadYou're del presentador de saber cómo crear el Reading a Preview repositorio. Unlock full access with a free trial. De esta forma inyectamos la dependencia ensamblando los componentes. Download With Free Trial Así que dentro del paquete di agrega una clase con ese nombre añade los siguientes métodos: public final class DependencyProvider { private private private private
static static static static
Context mContext; MemoryProductsDataSource memorySource = null; CloudProductsDataSource cloudSource = null; Sign up to vote on this title ProductsRepository mProductsRepository = null; Useful Not useful private DependencyProvider() { }
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks Magazines
News
Documents
copia de un gran trabajo
Save
Embed
Share
Print
Proyecto - Martin - TICS
1
Download
Join
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
return memorySource; }
Sheet Music
public static CloudProductsDataSource getCloudSource() { if (cloudSource == null) { cloudSource = new CloudProductsDataSource(); }
return cloudSource; } }
Ahora, en onViewCreated() ejecuta el método loadProducts() para cargar la list fragmento no ha sido retenido aún: @Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) super.onViewCreated(view, savedInstanceState); if(savedInstanceState== null) { mProductsPresenter.loadProducts(false); } }
You're Reading a Preview Unlock full access with a free trial.
Download With Free Trial
Sign up to vote on this title
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks Magazines
News
Documents
Sheet Music
copia de un gran trabajo
Save
Embed
Share
Print
Download
Join
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
Tarea #11. Proveer Scroll Infinito Al RecyclerView
You're Reading a Preview Unlock full access with a free trial.
Download With Free Trial
Sign up to vote on this title
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Download
Magazines
News
Documents
Join
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
public abstract class InfinityScrollListener extends RecyclerView.OnScrollListener {
Sheet Music
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) { }
}
Si eres intuitivo, deducirás que OnScrollListener nos reporta eventos de scroll través de onScrolled().
#2. Para que la escucha detecte cuando se está cargando datos o cuando se terminaron los datos, crea una interfaz llamada DataLoading dentro de produc
Incluye dos controladores para los eventos mencionados.
interface DataLoading { boolean isLoadingData(); boolean isThereMoreData(); }
You're Reading a Preview
Unlock full access with a free trial.
Download With Free Trial
#3. Enseguida, añade los siguientes miembros:
private static final int VISIBLE_THRESHOLD = 5; private final LinearLayoutManager mLayoutManager; private final DataLoading mDataLoading;
Sign up to vote on this title
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
Join
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
1
Download
Magazines
News
Documents
Sheet Music
Proyecto - Martin - TICS
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
public InfinityScrollListener(DataLoading dataLoading, LinearLayoutManager linearLayoutManager) { mDataLoading = checkNotNull(dataLoading); mLayoutManager = checkNotNull(linearLayoutManager); }
#5. ¿Cómo avisar que es momento de una carga nueva?
Incluye un método abstracto llamado onLoadMore().
public abstract void onLoadMore();
#6. Ahora, es turno de la lógica.
Para determinar las condiciones donde se inicia otra carga, usaremos estas variables:
visibleItemCount:
totalItemCount:
firstVisibleItem:
La cantidad de ítems visibles actualmente en la lista. You're Reading a Preview
full accesstotal with a free Retorna laUnlock cantidad de trial. ítems en el adaptador.
With Free Trial PosiciónDownload de primer ítem visible en la lista.
Con estos datos, establece esta condición:
“Si la cantidad total de ítems menos la cantidad visibles, es menor o igual que suma del primer ítem visto más el threshold, entonces…” Sign up to vote on this title Si sucede, actualiza la página, dispara el evento onLoadMore()
Useful
Not useful
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) { if 0 mDataLoading .isLoadingData() ||
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks Magazines
News
Documents
Sheet Music
copia de un gran trabajo
Save
Embed
Share
Print
Download
Join
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
Flujos adversos: evita la comprobación si el diferencial dy es menor a 0, si se cargando datos o si ya no hay más datos que cargar.
Permite al adaptador de productos reportar estados ¿Recuerdas la interfaz DataLoading? Bien. Impleméntala sobre ProductsAdapter.
public class ProductsAdapter extends RecyclerView.Adapter implements DataLoading
y sobrescribe los métodos. You're Reading a Preview @Override
public boolean isLoadingData()Unlock { full access with a free trial. return false; }
Download With Free Trial
@Override
public boolean isThereMoreData() { return false; }
Crea dos banderas miembro para hacerle seguimiento a ambos estados: @Override
public boolean isLoadingData() { return mLoading; }
Sign up to vote on this title
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
Join
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Download
Magazines
News
Documents
Sheet Music
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
private void setUpProductsList() { mProductsList.setAdapter( mProductsAdapter); final LinearLayoutManager layoutManager = (LinearLayoutManager) mProductsList.getLayoutManager(); // Se agrega escucha de scroll infinito. mProductsList.addOnScrollListener( new InfinityScrollListener( mProductsAdapter, layoutManager) { @Override public void onLoadMore() { mProductsPresenter.loadProducts( false); } }); }
Crea un criterio de selección de páginas Si queremos que solo se carguen los elementos pertenecientes a una página elementos, se necesario crear un filtro para ello. ¿Cómo haces eso? You're Reading a Preview
#1. Dentro de products crea un paquete llamado domain. Dentro de este crea Unlock full access with a free trial. llamado criteria. Free Trial #2. En segundo lugar, añade unaDownload interfazWith llamada ProductCriteria.
Su función es comprobar si los elementos de una lista cumplen con ciertos criterios.
public interface ProductCriteria { List match(List products); Sign up to vote on this title }
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Magazines
News
Documents
Sheet Music
Proyecto - Martin - TICS
1
Download
Join
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
public class PagingProductCriteria implements ProductCriteria { private final int mPage; private final int mLimit; public PagingProductCriteria( int page, int limit) { mPage = page; mLimit = limit; } @Override public List match(List products) { List criteriaProducts = new ArrayList<>(); // Sanidad if( mLimit <= 0 || mPage <=0){ return criteriaProducts; }
int size = products.size(); int numPages = size / mLimit; int a,b; if (mPage > numPages) { return criteriaProducts; } a = ( mPage - 1) * mLimit;
You're Reading a Preview
if (a == size) { return criteriaProducts; Unlock full access with a free trial. } b = a + mLimit;
Download With Free Trial
criteriaProducts = products.subList(a, b);
return criteriaProducts; } }
Sign up to vote on this title
Pasar criterio al repositorio ¡Bien hecho!
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Upload
Sign In
Join
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Proyecto - Martin - TICS
1
Download
Magazines
News
Documents
Sheet Music
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
// Ahora, preparamos el criterio de paginación ProductCriteria criteria = new PagingProductCriteria(page, PRODUCTS_LIMIT mProductsRepository.getProducts( new ProductsRepository.GetProductsCallback() { @Override
public void onProductsLoaded(List products) { mProductsView .showLoadingState( false); processProducts(products, reload); } @Override
public void onDataNotAvailable() { mProductsView .showLoadingState( false); mProductsView .showProductsError( ""); } },
criteria);
En CloudProductsDatasource , no usaremos el criterio ya que siempre consultare los productos de la API. Así que pasamos null en su método getProducts() Sin embargo, MemoryProductsDatasource si debe tratar el criterio.
En find() debes llamar a match() para retornar solo los elementos necesarios You're Reading a Preview Unlock full access with a free trial.
@Override
public List find(ProductCriteria criteria) {
Download With Free Trial
ArrayList products = Lists.newArrayList(mCachedProducts.values()); return criteria.match(products); }
Crear Un View Para Carga En El Adaptador
vote on this En la carga de ítems adicionales en nuestra lista, Sign poruplotogeneral setitleusa una Useful useful ya ProgressBar circular para mostrarle al usuario que vieneenNotcamino.
Este elemento debe posicionarse en la última casilla del recycler.
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Upload
Sign In
Join
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Download
Magazines
News
Documents
Sheet Music
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
private final static int PRODUCT_ITEM_TYPE = 1; private final static int FOOTER_ITEM_TYPE = 2;
#2. Ahora sobrescribe getItemViewType().
En esta instancia la interrogante es: “¿Qué condición uso para retornar un tipo u otro?”
Mira lo que yo pienso:
La única forma de que deba aparecer un elemento de carga, es que la posició actual exceda a la cantidad total de ítems… …además, la cantidad total debe ser mayor a 0.
Traducido a código esto sería: @Override
public int getItemViewType(int position) { if (position < getDataItemCount() && getDataItemCount() > 0) { return TYPE_PRODUCT ; }
return TYPE_LOADING_MORE ; }
You're Reading a Preview Unlock full access with a free trial.
Download With Free Trial
#3. Después, ve a onCreateViewHolder() e infla el view de carga si el parámetro viewType coincide con TYPE_LOADING_MORE .
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { Sign up to vote on this title Context context = parent.getContext(); LayoutInflater inflater = LayoutInflater.from(context); Useful Not useful View view;
if (viewType == TYPE_LOADING_MORE ) {
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Upload
Sign In
Join
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
1
Download
Magazines
News
Documents
Sheet Music
Proyecto - Martin - TICS
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
="http://schemas.android.com/apk/res/android"
android :orientation="vertical" android :layout_width="match_parent" android :minHeight="?listPreferredItemHeight" android :gravity="center" android :layout_height="wrap_content" >
android :layout_width="24dp" android :layout_height="24dp" android :id="@+id/progressBar" android :indeterminate="true" />
Y el holder contendrá solo la recolección de dicho view: private class LoadingMoreHolder extends RecyclerView.ViewHolder { public ProgressBar progress; public LoadingMoreHolder(View view) { super(view); progress = (ProgressBar) view.findViewById(R.id. progressBar ); } }
#4. Luego en el onBindViewHolder() procesa tipo de view llamado a You're Reading el a Preview getItemViewType(). Unlock full access with a free trial.
Si es de tipo carga, entonces genera un nuevo método llamado Download With Free Trial bindLoadingViewHolder() , donde se muestre la barra de progreso si la carga es activa y si hay más datos. @Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int posit switch (getItemViewType(position)) { case TYPE_PRODUCT : Product product = mProducts.get(position); ProductsHolder productsHolder = (ProductsHolder) viewHolder; Sign up to vote on this title productsHolder. price.setText(product.getFormatedPrice()); productsHolder.name.setText(product.getName()); Useful Not useful Glide.with(viewHolder.itemView.getContext()) .load(product.getImageUrl())
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
Join
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Download
Magazines
News
Documents
Sheet Music
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
Añadir/Remover el ítem de carga
En esta parte haremos que el adaptador obedezca al presentador de producto ¿Cómo? Usaremos dos métodos para mostrar/ocultar el ítem de carga. Y otro para avisar si hay más datos o si ya se terminaron.
public void dataStartedLoading() { if ( mLoading) return; mLoading = true; notifyItemInserted(getLoadingMoreItemPosition()); }
public void dataFinishedLoading() { if (! mLoading) return; mLoading = false; notifyItemRemoved(getLoadingMoreItemPosition()); }
You're Reading a Preview
public void setMoreData( boolean more) { Unlock full access with a free trial. mMoreData = more; }
Download With Free Trial dataStartedLoading() levanta
la bandera de carga activa. Además notifica sob inserción de un nuevo elemento en la última posición ( loading view). dataFnishedLoading() en
complemento, la desactiva y remueve el ítem.
Y setMoreData() tan solo determina si hay más datos o no. Sign up to vote on this title
Implementar los comportamientos en la vista Useful
Hagamos memoria:
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
Join
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Download
Magazines
News
Documents
Sheet Music
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
} @Override
public void allowMoreData( boolean allow) { boolean mProductsAdapter mProductsAdap ter.setMoreData(allow); }
¿Qué tal si corremos la app?
Corramos La App De Una Vez Finalmente inicia tu emulador o conecta tu dispositivo y presiona Run. Si todo nos ha salido de maravillas, veremos lo siguiente:
Sign up to vote on this title
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Upload
Sign In
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks Magazines
News
Documents
Sheet Music
copia de un gran trabajo
Save
Embed
Share
Print
Proyecto - Martin - TICS
1
Download
Join
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
¡El cascarón tiene vida!
…pero… ¿qué tal si creamos la API para ver datos reales?
Veamos cómo hacerlo.
Paso #8. Crear Servicio Web REST
Antes de que avances es importante que repases las lecciones sobre servicio y el estilo REST que he creado en mi blog:
Servicios Web Con PHP y MySQL
Servicios Web con estilo REST
Consumir Servicio Web REST
La conceptualización es importante para poder crear el de App Products. Ve y échale un vistazo a los artículos, aquí te espero, tomate tu tiempo …
…¿listo?
¡Excelente! En primer lugar, definamos la arquitectura que usaremos. Sign up to vote on this title
Elegir arquitectura del servicio REST Useful Not useful
Para este sistema usaremos Modelo-Vista-Controlador (MVC) junto a un patr
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Download
Magazines
News
Documents
Sheet Music
Join
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
¿Cómo funciona?
1. La app Android realiza una petición HTTP con el método GET para pedi todos los productos
2. El servicio entra en fase de enrutamiento, donde determina que control vista y modelo debe actuar. 3. El controlador consulta al repositorio por productos Sign up to vote on this title
Useful
4. El repositorio pide datos a la base de datos MySQL
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Magazines
News
Documents
Sheet Music
Proyecto - Martin - TICS
1
Download
Join
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
Parto del hecho de que ya has instalado tu entorno de pruebas XAMPP o WAM como te menciono en los tutoriales de servicios. ¿No es el caso? Clickea AQUÍ para encontrar algún tutorial.
Recuerda seleccionar como directorio de despliegue la carpeta \xampp\htdocs contrario el proyecto PHP no se interpretará.
Posteriormente enlistemos que tanto debemos realizar: Tareas para servicio REST
1. Terminar diseño de bases de datos 2. Implementar base de datos en MySQL 3. Diseñar las URIs para acceder a productos You're Reading a Preview
4. Diseñar la representaciónUnlock JSON de los full access withrecursos a free trial. Download 5. Definir estructura del proyecto PHPWith Free Trial
6. Crear enrutamiento en index.php 7. Implementar vista JSON 8. Implementar controlador de productos Sign up to vote on this title
9. Implementar repositorio de productos
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Download
Magazines
News
Documents
Sheet Music
Join
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
Comencemos inmediatamente.
Tarea #1. Diseño de base de datos Este paso es escueto en App Products.
Ya que tenemos solo una entidad estudiada para los productos, no es necesa entrar en más detalles. Pero ojo:
Recuerda capturar todos los elementos asociados a tus productos.
Puede que tengas categorías asociadas a estos. Promociones, composición varios productos en uno, accesorios, múltiples características compuestas, e
Diagrama ER
En mi caso, este ejemplo solo requiere el uso de un diagrama entidad-relación comprender el modelo de datos:
Sign up to vote on this title
Useful
Not useful
Tarea #2. Implementar base de datos en MySQL
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks Magazines
News
Documents
Sheet Music
copia de un gran trabajo
Save
Embed
Share
Print
Download
Join
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
Ahora en phpMyAdmin, selecciona en el panel izquierdo la opción “Nueva”.
panel derecho pon como nombre de la base de datos “app_products” y presio “Crear”.
Sign up to vote on this title
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks Magazines
News
Documents
Sheet Music
copia de un gran trabajo
Save
Embed
Share
Print
Download
Join
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
brand VARCHAR brand VARCHAR (128 128) ) NOT NULL, price DECIMAL(10 10, ,2) NOT NULL, unitsInStock INT(11 11) ) NOT NULL, imageUrl VARCHAR imageUrl VARCHAR (255 255) ) );
Insertar datos de prueba
Para el ejemplo que estamos estudiando he creado 1000 registros de ejemplo
1000 productos farmacéuticos falsos, que nos ayudarán a ver el comportami del servicio REST y nuestra app Android.
Está más que claro que poner los comandos INSERT en este tutorial es una loc Sin embargo, puedes usar el archivo product.sql que viene en la carpeta del tutorial. Luego ubícate en la tabla product y presiona la opción Importar.
Cuando estés en la screen de importación, presiona el botón “Seleccionar arc
Sign up to vote on this title
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Upload
Sign In
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks Magazines
News
Documents
Sheet Music
copia de un gran trabajo
Save
Embed
Share
Print
Download
Join
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
You're Reading a Preview Unlock full access with a free trial.
Download With Free Trial
Busca el script SQL y confirma su selección.
Por último presiona “Continuar” y espera hasta que se carguen los elementos Sign up to vote on this title
Useful Not useful Tarea #3. Diseñar URIs para productos
Por el momento la semántica es sencilla.
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
Join
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Download
Magazines
News
Documents
Proyecto - Martin - TICS
1
of 104
GET
Pool Conexiones
tap05_interfaces.ppt
Search document
/products
Recupera todos los prod
Sheet Music
Por ejemplo, si usásemos el dominio “http://api.appproductos.com” para ubic
nuestra API, entonces consultaríamos todos los productos de la siguiente ma http://api.appproductos.com/v1/products
Tarea #4. Diseñar presentación de recursos
¿Cómo es la estructura JSON que debe presentar las consultas GET de la URI anterior? Pensemos:
“Si deseo que vengan todos los productos con todas sus columnas, ¿qué deb hacer?” La respuesta está en el concepto “array” y atributos JSON alineados con las
propiedades del producto. Esquema de modelo:
You're Reading a Preview Unlock full access with a free trial.
Download With Free Trial
[ {
"code": "50436-1263" , "name": "Gabapentin" , "description": "Maecenas leo odio, condimentum id, luctus nec, molesti "brand": "Gabapentin", "price": "16.42", "unitsInStock" : 58, "imageUrl": "file:///android_asset/mock-product.png" }, {
Sign up to vote on this title
"code": "61727-307", Useful Not useful "name": "Insomnia Relief", "description": "Donec ut mauris eget massa tempor convallis.",
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
Join
copia de un gran trabajo
Save
Embed
Share
Print
Download
Proyecto - Martin - TICS
1
of 104
Magazines
News
Documents
¿Necesitamos códigos de error?
Sheet Music
¿Tan solo un mensaje?
Pool Conexiones
tap05_interfaces.ppt
Search document
Evaluando la situación de nuestra app, donde suponemos que es una app priv para los vendedores de una farmacia. Un solo mensaje bastará para orientarn Esquema de modelo: {
"message": "No tienes acceso a la API" }
Usaremos un atributo “string” llamado message, el cual contiene el mensaje de
producido en la API.
Tarea #5. Estructura del proyecto PHP
You're Reading a Preview Unlock full access with a free trial.
Download With Free Trial
La anterior ilustración es la jerarquía de directorios para el servicio REST. La raíz es App Products API.
Sign up to vote on this title
Useful
Not useful
Luego considerando que esta es la primera versión de la API, tenemos otro directorio llamado v1.
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
Join
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Download
Magazines
News
Documents
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
exceptions
Contiene las excepciones personalizadas PHP
http
Contiene los componentes HTTP relacionados al servicio REST
views
Contiene las vistas
.htaccess
Archivo para las reglas de renombrado de archivos
index.php
Punto de partida de la API
InjectionContainer.php
Clase contenedora de instancias que serán inyectadas manualm
Sheet Music
Tarea #6. Generar enrutamiento de recursos en index.php Llegados a este punto comenzamos programación You're la Reading a Preview web. full access with a free trial. urls”. Y el primer paso es crear “prettyUnlock
Download With Free Trial Como vimos en mi artículo sobre servicios REST, obviar las extensiones de archivos a la hora de consultar recursos es una forma sana de mejorar la sint
.htaccess Para ello debes crear un archivo .htaccess en la carpeta v1. Incluye las directivas de reescritura para Apache vistas en el tutorial. Sign up to vote on this title Fíjate: RewriteEngine
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
Join
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Download
Magazines
News
Documents
Sheet Music
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
“¿Cuándo el cliente Android nos envía una petición, que debe pasar?”
Sería algo así:
1. Llega una petición compuesta de: método HTTP, segmentos de url, cue (POST, PUT), tipo de contenido, autorización, etc. 2. Se extrae el recurso a consultar (primer segmento). 3. Dependiendo del recurso, se crea un controlador, vista y repositorio asociados. 4. El controlador ejecuta la acción dependiendo del método HTTP. 5. La vista imprime la respuesta obtenida desde el controlador. Ese es el resumen de las acciones. Veamos cómo interpretarlas en código PHP.
Las peticiones HTTP
You're Reading a Preview
Dentro del directorio http agrega unafullnueva clase llamada Request (“petición” Unlock access with a free trial. español). Download With Free Trial
Según lo que detallamos, esta tiene varios atributos. Pero por el momento pondremos solo los que usaremos. Verbo (método HTTP) y segmentos de la url. La obtención de ambos será en el constructor. Como ya sabes, usa $_SERVER[‘REQUEST_METHOD ’] y $_GET[‘PATH_INFO’] para conseguir sus valores. Sign up to vote on this title
class Request {
public $url_elements ;
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Download
Magazines
News
Documents
Sheet Music
Join
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
} }
En segundo lugar, vuelve a index.php y crea una nueva petición. // Tomamos la petición entrante $request = new Request();
Filtrar recurso solicitado
Ya sabes que $url_elements tiene los segmentos de la url y que el primero ser recurso ([0]). Así que obtenlo en una variable a parte. // Se preparan directrices de enrutamiento $plural_uc_resource_name = ucfirst($request->url_elements [0]);
Crear controlador, vista y repositorio You're Reading a Preview
Aún no tenemos implementaciones de estos componentes. Unlock full access with a free trial.
El asunto es: Download With Free Trial
Debemos cargar sus clases en tiempo de ejecución con el nombre del recurso extraído. ¿Cómo hacerlo esto? Fabrica el nombre de las clases MVC asociadas al recurso.
Esto está ligado a tus reglas de nombrado. Por ejemplo…
Sign up to vote on this title
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks Magazines
News
Documents
Sheet Music
copia de un gran trabajo
Save
Embed
Share
Print
Download
Join
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
Programáticamente lo que tenemos que hacer, es poner en mayúscula la prim letra del recurso y luego concatenarlo a las plantillas. Observa: $controller_name = $plural_uc_resource_name . 'Controller'; $repository_name = $plural_uc_resource_name . 'Repository'; $sql_data_source_name = 'Sql' . $plural_uc_resource_name . 'DataSource' ;
Sabiendo los nombres de las clases, entonces creamos instancias de ellas (s que existen). if (class_exists($controller_name) && class_exists($repository_name) && class_exists($sql_data_source_name) ) { // Ahora, ensamblamos la triada MVC $json_view = new JsonView(); $sql_data_source = new $sql_data_source_name( InjectionContainer:: provideDatabaseInstance()); $repository = new $repository_name($sql_data_source); $controller = new $controller_name($repository);
… You're Reading a Preview
Ejecutar acción del controlador Unlock full access with a free trial.
Los controladores manejarán como mínimo los cuatro métodos principales H Download With Free Trial GET, POST, PUTy DELETE. Y para ejecutar alguno en tiempo real debemos estandarizar sus accesos. ¿De qué manera hacerlo? Respuesta certera: Crear métodos en el controlador tipo *Action().
Es decir,
Sign up to vote on this title
Useful
postAction(), getAction(), putAction() y deleteAction() .
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Download
Magazines
News
Documents
Sheet Music
Join
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
Imprimir la respuesta de la acción Y para el final, la instancia de la vista JSON imprime la respuesta. $json_view->render($response);
Aún no la tenemos ninguna clase implementada. Por esa razón, iremos al siguiente paso…
Tarea #7. Implementar Vista
En primer lugar diseñaremos la vista a través de una interfaz que desacople e comportamiento. ¿Qué acciones tendrá? Renderizar la respuesta.
Así que crea una nueva interfaz llamada View dentro de la carpeta views: interface View {
You're Reading a Preview
Unlock full access with a free trial. public function render($response);
}
Download With Free Trial
Ahora crearemos una implementación específica. Se trata de JsonView. Es la vista que mostrará todas las respuestas de nuestra API.
Ella tomará los resultados de nuestros recursos ySign enviará alon cliente up to vote this titlela informa
Veamos:
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Upload
Sign In
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Download
Magazines
News
Documents
Sheet Music
Join
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
Con el objeto Response que toma la vista, cerciórate de establecer el tipo, el cu el código HTTP de respuesta.
Respuestas
Al igual que las peticiones, también conceptualizaremos las respuestas en có Esta tendrá el cuerpo con los datos y el estado HTTP resultante. En pocas palabras, tendremos un pojo básico así: class Response { private $body; private $status; public function getBody() { return $this-> body; }
public function setBody($body) { $this-> body = $body; }
public function getStatus() { return $this->status; }
You're Reading a Preview
Unlock full access with a free trial.
public function setStatus($status) { $this->status = $status; }
Download With Free Trial
}
Como vimos hace poco, la vista usará estos elementos para renderizar el resu al cliente. Sign up to vote on this title
useful Useful de Not Tarea #8. Implementar controlador productos
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Download
Magazines
News
Documents
Sheet Music
Join
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
function deleteAction($request); }
El siguiente paso es crear el controlador de los productos. Añade una clase llamada ProductsController e implementa a Controller. class ProductsController implements Controller {
Constructor
Luego genera un constructor que reciba el repositorio como parámetro y lo as a una variable miembro predefinida. private $productsRepository; public function __construct($productsRepository) { $this-> productsRepository = $productsRepository; }
You're Reading a Preview
getAction()
Unlock full access with a free trial.
Enseguida escribe las 4 acciones.
Download With Free Trial
public function getAction($request) { }
public function postAction($request) { }
public function putAction($request) { }
public function deleteAction($request) {
Sign up to vote on this title
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Upload
Sign In
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
Join
copia de un gran trabajo
Save
Embed
Share
Print
Proyecto - Martin - TICS
1
Download
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
Magazines
News
Documents
El resultado (tanto exitoso como adverso) será empaqueta en un objeto Respo
Sheet Music
Este será retornado a la vista (output handler) para imprimirlo. public function getAction($request) { $response = new Response(); if (isset($request->url_elements[1])) { throw new ApiException(400, STATUS_CODE_400_MALFORMED ); } else { $results = $this-> productsRepository->getAllProducts();
if (is_array ($results)) { $response->setBody($results); $response->setStatus(200); } else if (is_string ($results)) { $response->setBody(['message' => $results]); $response->setStatus(200); } }
return $response; }
You're Reading a Preview
La cosa, es que no tenemos al repositorio todavía.
Unlock full access with a free trial.
¿Qué tal si lo creamos?
Download With Free Trial
Tarea #9. Implementar repositorio de productos
Con la aplicación Android que creamos al inicio desarrollamos el concepto de repositorio. Para el servicio web es exactamente lo mismo.
Sign up to vote on this title
Useful Not useful Crearemos un interfaz del repositorio de productos, determinando comportamientos por cada acción a los datos.
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Upload
Sign In
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Magazines
News
Documents
Proyecto - Martin - TICS
1
Download
Join
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
public function getAllProducts(); }
Sheet Music
Por añadidura, creamos la implementación del repositorio llamada ProductsRepository. Recuerda que este debe comunicarse con la fuente de datos SQL. En otras palabras: Define una variable miembro llamada $sqlProductsDataSource y asígnala en el constructor.
class ProductsRepository implements IProductsRepository {
private $sqlProductsDataSource ; public function __construct(ProductsDataSource $productsDataSource) { $this->sqlProductsDataSource = $productsDataSource; }
You're Reading a Preview public function getAllProducts() {
Unlock full access with a free trial.
return $this->sqlProductsDataSource ->retrieve(); } }
Download With Free Trial
¿Notas que dentro de getAllProducts() invocamos el método retrieve() de la fuente de datos? Bien, este hace parte de la siguiente definición: Sign up to vote on this title
Useful Not useful Tarea #10. Implementar fuentede datos MySQL
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks Magazines
News
Documents
Sheet Music
copia de un gran trabajo
Save
Embed
Share
Print
Download
Join
Proyecto - Martin - TICS
1
of 104
Implementación de la fuente de datos
Conexión PDO hacia MySQL
Pool Conexiones
tap05_interfaces.ppt
Search document
En ese orden de cosas, construyamos.
Crear interfaz de fuente de datos MySQL
Eliminando responsabilidades crearemos una interfaz repositorio-fuente llam ProductsDataSource.
Necesitamos obtener todos los productos, así que el único método será retri
interface ProductsDataSource { function retrieve(); }
Crear fuente de datos MySQL
You're Reading a Preview
Crea una nueva clase llamada SqlProductsDataSource e implementa Unlock full access with a free trial. ProductsDataSource. Download With Free Trial class SqlProductsDataSource implements ProductsDataSource {
Siguiendo la misma rutina, pon una variable miembro para la conexión PDO llamada $dbh (database handler ). Pasa la dependencia en el constructor: private $dbh; private $table_name = PRODUCT_TABLE_NAME ;
Sign up to vote on this title
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
Join
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Download
Magazines
News
Documents
Sheet Music
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
$stmt = $this->dbh->prepare($sql); if ($stmt->execute()) { return $stmt->fetchAll(PDO::FETCH_ASSOC ); } else { return $stmt->errorInfo()[2]; } }
¿Qué fue lo que hice?
Lo común. Creé un comando $sql con la sentencia SELECT para la tabla produc La constante datasource/tables.php
puedes
encontrarla
en
el
Luego preparé la sentencia (prepare()). Y al final la ejecuté (execute()). Si todo vino bien, entonces retorno un array asociativo con fetchAll(). You're Reading a Preview
De lo contrario, retorno un string con el mensaje de error ocurrido (errorInfo() Unlock full access with a free trial.
Tarea #11. Manejar errores excepciones de P Download Withcon Free Trial
Resulta que hay errores que podrían destruir nuestra respuesta abruptamente Por ejemplo, cuando intentamos conectar PDO, al detectar formatos no compatibles en la URI de la petición, etc. Estos son elementos por fuera del comportamiento feliz.
Sign up to vote on this title
Y esta es la solución:
Useful
Not useful
Usa las excepciones de PHP para crear respuestas para estos comportamien
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Download
Magazines
News
Documents
Sheet Music
Join
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
class ApiException extends Exception { public $response; public function __construct($status, $message) { $this->response = new Response(); $this->response->setStatus($status); $this->response->setBody(['message' => $message]); } }
#3. Por último, ve a index.php y registra un manejador de excepciones con set_exception_handler() .
Este se encargará de recibir la excepción, crear una nueva vista JSON e imprim respuesta: set_exception_handler( function (ApiException $exception) { $json_view = new JsonView(); $json_view->render($exception->response); } );
You're Reading a Preview Unlock full access with a free trial.
Carga automática de recursos construidos Download Free Trialse intente usar index.php ¿Te has preguntado qué pasa cuando enWith ProductsController si no tenemos una directiva de importación definida?
Claramente tendrás un error de acceso a los ficheros. Ahora… …¿cómo incluirlos en tiempo de ejecución?
Respuesta concreta: Autoloaders.
Sign up to vote on this title
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Magazines
News
Documents
Sheet Music
Proyecto - Martin - TICS
1
Download
Join
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
if ( preg_match('/[a-zA-Z]+Controller$/' , $classname)) { @include __DIR__ . '/controllers/' . $classname . '.php'; return true; } elseif ( preg_match('/[a-zA-Z]+Repository$/' , $classname)) { @include __DIR__ . '/data/' . $classname . '.php'; return true; } elseif ( preg_match('/[a-zA-Z]+DataSource$/' , $classname)) { @include __DIR__ . '/data/datasource/' . $classname . '.php'; return true; }
return false; }
Cuando los controladores, repositorios o fuentes de datos sean intentados de basados en un nombre dinámico, entonces apiAutoload() será ejecutado.
Dependiendo del string que entra como $classname (nombre de la clase), así m se incluye (include) el archivo.
Este tip y varios de los que te he mostrado han sido influencia de Lorna Jane. Una ex desarrolladora de IBM. Tiene lecturas obligadas en su blog y publicaciones. You're Reading a Preview Unlock full access with a free trial. Contenedor de dependencias
Para crear la conexión PDO, usaremos una clase llamada InjectionContainer Download With Free Trial
Básicamente el objeto PDO será inicializado con los datos de conexión. Y luego proveeremos a través de un método. Échale un vistazo: Sign up to vote on this title
class InjectionContainer { private static $pdo = null;
Useful
public static function provideDatabaseInstance() {
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
Join
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
1
Download
Magazines
News
Documents
Proyecto - Martin - TICS
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
throw new ApiException(500, STATUS_CODE_500 ); }
}
Sheet Music
return self::$pdo; } }
Los datos de acceso a MySQL están definidos en las siguientes constantes: data/datasource/mysql_login.php
Por lo general, el usuario administrador de MySQL es “root” sin contraseña. You're Reading a Preview
Pero si modificaste las credenciales, debes cambiar los valores aquí. Unlock full access with a free trial.
Ensamblar la triada MVC Download With Free Trial
Ya para finalizar el desarrollo, ve a index.php y completa la creación de la vist controlador, la fuente de datos y el repositorio. // Se preparan directrices de enrutamiento $plural_uc_resource_name = ucfirst($request->url_elements[0]); $controller_name = $plural_uc_resource_name . 'Controller'; $repository_name = $plural_uc_resource_name . 'Repository'; $sql_data_source_name = 'Sql' . $plural_uc_resource_name . 'DataSource' ; Sign up to vote on this title
if (class_exists($controller_name) && class_exists($repository_name) && class_exists($sql_data_source_name)
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Download
Magazines
News
Documents
Join
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
} else {
throw new ApiException(400, STATUS_CODE_400_MALFORMED );
Sheet Music
}
¡Uff! Y ahora sí…tenemos una miniAPI.
¿Qué tal funcionará? Vamos a checar…
Tarea #12. Testear recuperación de productos Ve a tu navegador favorito y teclea la siguiente URL: http://localhost/api.appproducts.com/v1/products Si todo va bien, podrás ver los 1000 productos farmacéuticos: You're Reading a Preview Unlock full access with a free trial.
Download With Free Trial
Sign up to vote on this title
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks Magazines
News
Documents
Sheet Music
copia de un gran trabajo
Save
Embed
Share
Print
Download
Join
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
You're Reading a Preview Unlock full access with a free trial.
Download With Free Trial
Sign up to vote on this title
Cool, ¿no?
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Magazines
News
Documents
Sheet Music
Proyecto - Martin - TICS
1
Download
Join
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
(Recuerda, este es solo el nivel 1 del proyecto, obviamente añadiremos características en los siguientes tutoriales)
Ahora vamos a ver cómo usar la librería Retrofit para construir el cliente RE Android.
Paso #9. Crear Cliente HTTP Para Consumir La API Llegamos al último paso. Nuestro servicio REST con PHP está funcionando y nuestra app Android lista consumir.
Para crear la implementación de nuestra fuente de datos en el servidor, usare la librería Retrofit. ¿Para qué sirve? You're Reading a Preview Para facilitar peticiones HTTP hacia nuestras APIs. Unlock full access with a free trial.
Se acomoda bastante bien a las URLs que maneja el estilo REST. Download With Free Trial
Y nos permite usar Gson para convertir las respuestas directamente en objeto negocio. ¡Realmente poderosa!
Como te imaginarás, codificaremos menos código para tener rápidamente los productos en nuestra app. Sign up to vote on this title
¿Convencido a usarla?
Useful
Not useful
Si no es el caso, recuerda que siempre tendrás varias opciones como el client
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Download
Magazines
News
Documents
Sheet Music
Join
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
dependencies { compile 'com.squareup.retrofit2:retrofit:2.1.0' }
Ahora, para añadir el módulo de agregación para Gson, usa las siguientes dependencias: dependencies { compile 'com.squareup.retrofit2:converter-gson:2.1.0' compile 'com.google.code.gson:gson:2.7' }
Sincroniza tus archivos de construcción Gradle y estarás listo.
Tarea #2. Habilitar permisos de red
Superimportante que nuestra app le pida permisos al sistema para acceder a conexión de red. ¿La forma?
You're Reading a Preview Unlock full access with a free trial.
Incluye la siguiente etiqueta en tu AndroidManifest.xml. Download With Free Trial
...
Sign up to vote on this title
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
Join
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Download
Magazines
News
Documents
Sheet Music
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
Si recuerdas la entidad para los productos, yo antepuse una m para los nomb los campos. Y es casi infalible que al realizar la conversión, no obtendrás los datos correctamente, solo por esto. ¿Cómo arreglarlo?
Usa la anotación @SerializedName de Gson.
Esta indica al parser, que en el campo con la anotación debe ir el valor del atri JSON.
Por ejemplo, nosotros tendríamos que cambiar todos los atributos de la sigui manera: public class Product { @SerializedName("code") private String mCode; @SerializedName("name") private String mName; @SerializedName("description" ) Reading a Preview private String mDescriptionYou're ; @SerializedName("brand") private String mBrand ; @SerializedName("price") private float mPrice;
Unlock full access with a free trial.
Download With Free Trial
@SerializedName("unitsInStock" ) private int mUnitsInStock ; @SerializedName("imageUrl" ) private String mImageUrl ;
Sign up to vote on this title
Useful
Not useful
Tarea #4. Definir endpoints para la API
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Download
Magazines
News
Documents
Sheet Music
Join
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
La respuesta sencilla: definen el tipo de respuesta y los componentes de la u más. Por ejemplo…
Si vamos a usar el método GET, entonces anotamos con @GET la petición. Con POST sería @POST… …y así sucesivamente.
Teniendo en claro eso, te mostraré como definir la operación de consulta de l productos. public interface ApiEndpoints { @GET("products") Call> getProducts(); }
¿Ves lo sencillo que es? Call es
la invocación de un método HTTP desde Retrofit, la cual tiene como You're Reading a Preview objetivo el recurso “products” anotado con @GET y retornará una lista de objeto Product. Unlock full access with a free trial. Download With Free Trial Tarea #5. Crear Instancia Del Cliente
A continuación crearemos el cliente REST.
Ve a CloudProductsDataSource y define dos variables miembro: un objeto Re otro RestService. Adicionalmente, incluye una constante para la URL base. Sign up to vote on this title
Useful
Not useful
public static final String BASE_URL = "http://10.0.2.2/api.appproducts.com private final Retrofit mRetrofit ; private final RestService mRestService;
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Magazines
News
Documents
Sheet Music
Proyecto - Martin - TICS
1
Download
Join
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
Si usas genymotion, pon “10.0.3.2”
Si estás usando tu teléfono + PC local, deben estar bajo la misma red. A solo usas la IP del PC en el que te encuentres.
Retomando. El objeto Retrofit es el punto de entrada del cliente REST. Su fun es tomar las llamadas Call y procesar su envío. Para crearlo, ve al constructor y usa su patrón builder. public CloudProductsDataSource() { mRetrofit = new Retrofit.Builder() .baseUrl(BASE_URL_AVD ) .addConverterFactory(GsonConverterFactory. create()) .build();
mRestService = mRetrofit .create(RestService. class); }
Con baseUrl() pon el url definida. Y añade un conversor Gson con addConverterFactory(). You're Reading a Preview
De paso, crea la instancia de RestService con ayuda Unlock full access withla a free trial. del cliente, a través del método create(). Download With Free Trial
Tarea #6. Ejecutar la petición Posteriormente, enviaremos la petición al servidor. La forma de hacerlo es con los métodos Call.execute() y Call.enqueue(). El primero ejecuta la petición en el hilo principal.
Sign up to vote on this title
Useful
Not useful
El segundo lo hace asíncronamente y notifica su resultado con la interfaz Callback
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Upload
Sign In
Join
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
1
Download
Magazines
News
Documents
Sheet Music
Proyecto - Martin - TICS
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
ProductCriteria criteria) { Call> call = mRestService .getProducts(); call.enqueue(new Callback>() { @Override public void onResponse(Call> call, Response> response) { // Procesamos los posibles casos processGetProductsResponse(response, callback); } @Override
public void onFailure(Call> call, Throwable t) { callback.onError(t.getMessage()); } }); }
Como ves, primero llamamos a RestService.getProducts() para apilar la petici call.
Luego llamamos a enqueue() y tomamos su resultado con una interfaz anónim onResponse() retorna
la respuesta en su parámetro response. Si fue exitosa You're Reading a Preview (isSuccesfull()), entonces retornamos el contenido ( response.body()). Unlock full access with a free trial.
De lo contrario en onFailure(), notificamos el error. Download With Free Trial
Para procesar la respuesta, podemos aislar el comportamiento en un método llamado processGetProductsResponse() de la siguiente forma:
private void processGetProductsResponse(Response> response,
ProductServiceCallback callback) { String error = "Ha ocurrido un error"; Sign up to vote on this title ResponseBody errorBody = response.errorBody(); Useful Not useful // ¿Hubo un error? if (errorBody != null) {
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Upload
Sign In
Join
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
Magazines
News
Documents
Proyecto - Martin - TICS
1
Download
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
if (response.isSuccessful()) { callback.onLoaded(response.body());
}
Sheet Music
}
El papel de Gson: No hicimos un parsing de JSON a objetos Product explicito, que el módulo de Retrofit se encarga de ello.
Respuesta de error: Crea una clase llamada ErrorResponse con un atributo str para capturar las respuestas de error que diseños en la API.
public class ErrorResponse { @SerializedName("message") String mMessage; public String getMessage() { return mMessage; } }
You're Reading a Preview
Recuerda que el método Gson.from() parsea un flujo JSON en un objeto cuya c Unlock full access with a free trial. pones como parámetro. Download With Free Trial
Pon A Prueba Tú App Productos
Para finalizar, levanta los servicios de Apache y MySQL, ejecuta a App Produc visualiza los resultados. ¿Qué ves?
Sign up to vote on this title
Useful Not useful Valida todos los comportamientos vistos en el diseño de wireframes.
Swipe to refresh
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks Magazines
News
Documents
Sheet Music
copia de un gran trabajo
Save
Embed
Share
Print
Download
Join
Proyecto - Martin - TICS
1
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
You're Reading a Preview Unlock full access with a free trial.
Download With Free Trial
Pruébala lo más que puedas y ajústala a tus necesidades … Sign up to vote on this title
¿Qué Tal Te Fue?
Useful
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join
Search
Home
Saved
0
43 views
Sign In
Upload
Join
RELATED TITLES
0
eBook android Uploaded by Paul Sumer
Top Charts
Books
Audiobooks
copia de un gran trabajo
Save
Embed
Share
Print
1
Download
Magazines
News
Documents
Sheet Music
Proyecto - Martin - TICS
of 104
Pool Conexiones
tap05_interfaces.ppt
Search document
Seguir unos pasos lógicos para desarrollar
Repasar la creación de servicios REST con un ejemplo más popular
Empezar a incluir librerías como Retrofit para ahorrar tiempo y paz men
Comenzar una app completa que te sirva de ejercicio, proyecto de grad emprendimiento o incluso como plantilla para tu trabajo.
Aspiro a que mi esfuerzo te haya permitido alcanzar al menos uno de ellos.
¿Qué vendrá En El Nivel #2? ¡Mantente atento! Ya que estaba contemplando incluir en la segunda etapa lo siguiente:
Autorización correo/contraseña en la API
Uso de Dagger
access with a free trial. Implementar servicio webUnlock confullLaravel/Slim
Uso de servicio de hosting/cloud computing real
Inclusión de Sync Adapter para control de casos de sincronización
Pantalla detalle del producto
Pantalla de login
You're Reading a Preview
Download With Free Trial
Sign up to vote on this title
Useful
Creación de fuente de datos local con SQLite
Not useful
Home
Saved
Top Charts
Books
Audiobooks
Magazines
News
Documents
Sheet Music
Upload
Sign In
Join