RecyclerView ¿el heredero del Listview?

RecyclerView ¿el heredero del Listview?
recycler

Con la llegada de Android Lollipop, hace ya algún tiempo, recibimos una serie de views que los desarrolladores podemos echar mano. En este caso os hablaré de RecyclerView.

¿Qué es RecyclerView?

Es un contenedor de elementos (listas), como puede ser ListView, del que precisamente y según los de Google dicen que es una versión sucesora y mejorada de este. Ante esta afirmación tengo alguna que otra reserva, pero os lo comentaré más adelante. La principal ventaja que plantea utilizar este view es que está diseñado para "optimizar el funcionamiento frente a ListView", puesto que recicla las vistas de elementos anteriores que no se están visualizando en la pantalla para utilizarlo en los próximos elementos. Perfecto si tenemos un largo volumen de elementos en dichas listas, como por ejemplo en aplicaciones tipo Twitter.

¿Cómo usarlo?

De una manera muy similar al ListView, necesitaremos una fuente de datos, un ArrayList/List por ejemplo, y un adaptador que será el encargado de leer, procesar e inflar en la lista. Primero de todo, las librerías. Puesto que es una view de las ultimas versiones de Android, los chicos de Google lo han includo en los paquetes de compatibilidad para que sea retrocompatible con las versiones anteriores a esta. compile 'com.android.support:recyclerview-v7:21.0.+' Seguidamente definiremos nuestro RecyclerView en el layout donde lo queremos incluir: <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" /> Creamos otro layout que definirá la interfaz de los elementos de la lista, en nuestro caso un simple TextView: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/title" android:layout_width="match_parent" android:layout_height="20dp" /> </RelativeLayout> Y hora pasamos a donde se encuentra la magia, el Adapter: public class ReciclerAdapter extends RecyclerView.Adapter<ReciclerAdapter.MyViewHolder> { private List<String> items; private Context context; public ReciclerAdapter(Context context, List<String> items) { this.context = context; this.items= items; } @Override public int getItemCount() { return items.size(); } @Override public void onBindViewHolder(MyViewHolder itemsViewHolder, int i) { itemsViewHolder.vTitle.setText(item.get(item)); } @Override public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View itemView = LayoutInflater. from(viewGroup.getContext()). inflate(R.layout.fragment_item, viewGroup, false); return new MyViewHolder(itemView); } public static class MyViewHolder extends RecyclerView.ViewHolder { protected TextView vTitle; public MyViewHolder(View v) { super(v); vTitle = (TextView) v.findViewById(R.id.title); } } } Como vemos, es muy similar a la estructura de los clásicos ListViews, con la diferencia que implementamos una clase dentro de esta, los ViewHolders. Estos son precisamente los que reutilizaremos y reciclaremos en nuestras vistas. No creo que necesite mucha más explicación puesto que la mayoría ya utilizaba este método en los ListViews para hacer esto mismo, solamente que para los RecyclerViews va a ser condición indispensable su utilización. Y finalmente en nuestros Activity/Fragment lo implementaremos de la siguiente manera: RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view); recyclerView.setHasFixedSize(true); LinearLayoutManager llmanager = new LinearLayoutManager(this); llmanager.setOrientation(LinearLayoutManager.VERTICAL); recyclerView.setLayoutManager(llmanager); RecyclerAdapter myAdapter = new RecyclerAdapter(this, createList(30)); recyclerView.setAdapter(myAdapter);Nota: la función createList() es un pequeño método de ejemplo donde creo una lista de 30 Strings que se le pasa al Adapter para pintarlos en el RecyclerView.

¿Contras?

Aunque tiene la ventaja de soportar multitud de animaciones muy eficientes para cuando creamos, editamos y eliminamos un elemento, entre otras tantas pijadas, carece de otras funcionalidades básicas. A destacar por mi parte: No tiene un método para implementar empty views o lo que es lo mismo, imágenes/texto para cuando no hay ningún elemento en la lista. No dispone de un método que recoja la pulsación del elemento. Lo que antes era el OnItemClick(), por lo que deberemos implementar esta funcionalidad por nuestra cuenta en los Adapters. Y un largo etc. Es un poco más tedioso de implementar y trabajar que con otras views. Por ello yo personalmente no lo calificaría como sucesor. Puede ser que en cierto casos te interese utilizar otra view que un RecyclerView, pero si soy consciente de su potencial, por eso lo intento utilizar simple que me conviene. ¿Y a vosotros qué os ha parecido?