Con mi nueva aplicación que he estado desarrollando con los nuevos elementos del material design de google. Va a ser un pequeño juego divertido y es perfecta para experimentar. He implementado una tabla de clasificación en la aplicación utilizando un ListView, pero luego pensé que podría sustituirlo por el RecyclerView . El RecyclerView sirve para manejar grandes conjuntos de datos de manera más eficiente que el ListView y ofrece grandes soluciones de personalización y de animación. Se centra en el reciclaje que hace que la adición y eliminación de productos más eficientes. Si la lista no es dinámica o no está poblada desde la nube entonces no hay razón para reemplazar su ListView existente con RecyclerView .
Me voy a centrar en el código e ignorar el hablar mucho porque yo mismo voy directo al punto en lugar de hacer una entrada del blog larga.
Mi ListView actualmente incluye tres TextViews y un ImageView. Así es como se construye:
Layout
List item layout
Code
Pon este código cuando termine de llenar sus matrices:
myadapter = new MyAdapter(getActivity(), arr_userid, arr_username, arr_photo, arr_level, arr_date); lv.setAdapter(myadapter);
Esta es tu clase Adapter:
public class MyAdapter extends BaseAdapter { public String title[]; public String description[]; public Activity context; ArrayListSu aplicación ListView debería ser muy similar a la mía. Rellenar las matrices de alguna manera (en mi caso puedo descargar los datos desde la nube), y obligar a estos a la adaptador.arr_userid = new ArrayList (); ArrayList arr_username = new ArrayList (); ArrayList arr_photo = new ArrayList (); ArrayList arr_level = new ArrayList (); ArrayList arr_date = new ArrayList (); public LayoutInflater inflater; public MyAdapter(Context context, ArrayList arr_userid, ArrayList arr_username, ArrayList arr_photo, ArrayList arr_level, ArrayList arr_date) { super(); this.arr_userid = arr_userid; this.arr_username = arr_username; this.arr_photo = arr_photo; this.arr_level = arr_level; this.arr_date = arr_date; this.inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getCount() { return arr_userid.size(); } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } public class ViewHolder { TextView txtName, txtPoints, txtDate; ImageView ivUser; RelativeLayout row; } @Override public View getView(final int position, View convertView, ViewGroup parent) { final ViewHolder holder; if(convertView==null) { holder = new ViewHolder(); convertView = inflater.inflate(R.layout.leaderboard_row, null); holder.txtName = (TextView) convertView.findViewById(R.id.txtName); holder.txtPoints = (TextView) convertView.findViewById(R.id.txtPoints); holder.txtDate = (TextView) convertView.findViewById(R.id.txtDate); holder.ivUser = (ImageView) convertView.findViewById(R.id.ivUser); holder.row = (RelativeLayout) convertView.findViewById(R.id.lineItem); convertView.setTag(holder); } else holder=(ViewHolder)convertView.getTag(); holder.txtName.setText(arr_username.get(position)); holder.txtPoints.setText(arr_level.get(position) + " Levels"); String year = arr_date.get(position).substring(0,4); String month = arr_date.get(position).substring(5,7); String day = arr_date.get(position).substring(8,10); holder.txtDate.setText(month + "." + day + "." + year); if (!arr_photo.get(position).equals("")) { Picasso.with(getActivity()) .load(arr_photo.get(position)) .into(holder.ivUser); } else { holder.ivUser.setImageDrawable(null); } return convertView; } }
Aquí viene la parte divertida. Nuestra implementación RecyclerView es de aprox. 20 % diferente :)
Gradle
Agregue esto a su build.gradle:
compile 'com.android.support:recyclerview-v7:+'
Si usted tiene cualquier problema, reconstruir y limpiar el proyecto. No te olvides de descargar la biblioteca de soporte en el Administrador de SDK.
Layout
Definir el RecyclerView
rv = (RecyclerView)view.findViewById(R.id.rv); rv.setHasFixedSize(true); LinearLayoutManager llm = new LinearLayoutManager(getActivity()); rv.setLayoutManager(llm);
Utilice setHasFixedSize cuando se sabe que la anchura y la altura de la RecyclerView no cambiarán. Siempre que se insertan artículos, moviendo o eliminado el tamaño (anchura y altura) de RecyclerView podría cambiar. Los elementos de la lista también pueden tener anchura variable o la altura por defecto. Si su aplicación carece de estas operaciones, RecyclerView estará mejor optimizado como sabe el tamaño exacto de antemano sobre la base de su adaptador.
A diferencia de ListView , un RecyclerView necesita un LayoutManager para gestionar el posicionamiento de sus artículos y para detertime cuando es el momento de reciclar las vistas. Hay 3 tipos de la LayoutManager como LinearLayoutManager, GridLayoutManager y StaggeredGridLayoutManager. Ahora quedémonos con LinearLayoutManager.
Pon este código en el que termine de llenar sus matrices :
No es gran cosa, Pero espero que puedan encontrar las similitudes en ambos métodos y reemplazar su ListView existente con RecyclerView.
Pon este código en el que termine de llenar sus matrices :
myadapter = new CustomAdapter(getActivity(), arr_userid, arr_username, arr_photo, arr_level, arr_date); rv.setAdapter(myadapter);Codigo
public class CustomAdapter extends RecyclerView.Adapter { ArrayList arr_userid = new ArrayList(); ArrayList arr_username = new ArrayList (); ArrayList arr_photo = new ArrayList (); ArrayList arr_level = new ArrayList (); ArrayList arr_date = new ArrayList (); public LayoutInflater inflater; public CustomAdapter(Context context, ArrayList arr_userid, ArrayList arr_username, ArrayList arr_photo, ArrayList arr_level, ArrayList arr_date) { super(); this.arr_userid = arr_userid; this.arr_username = arr_username; this.arr_photo = arr_photo; this.arr_level = arr_level; this.arr_date = arr_date; this.inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } public class ViewHolder extends RecyclerView.ViewHolder { public TextView txtName, txtPoints, txtDate; public ImageView ivUser; public ViewHolder(View v) { super(v); txtName = (TextView) v.findViewById(R.id.txtName); txtPoints = (TextView) v.findViewById(R.id.txtPoints); txtDate = (TextView) v.findViewById(R.id.txtDate); ivUser = (ImageView) v.findViewById(R.id.ivUser); } } public void add(int position, String item) { arr_userid.add(position, item); notifyItemInserted(position); } public void remove(String item) { int position = arr_userid.indexOf(item); arr_userid.remove(position); notifyItemRemoved(position); } public CustomAdapter(ArrayList myDataset) { arr_userid = myDataset; } @Override public CustomAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.leaderboard_row, parent, false); ViewHolder vh = new ViewHolder(v); return vh; } @Override public void onBindViewHolder(ViewHolder holder, int position) { final String name = arr_username.get(position); holder.txtName.setText(arr_username.get(position)); holder.txtName.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { remove(name); } }); holder.txtPoints.setText(arr_level.get(position) + " Levels"); String year = arr_date.get(position).substring(0,4); String month = arr_date.get(position).substring(5,7); String day = arr_date.get(position).substring(8,10); holder.txtDate.setText(month + "." + day + "." + year); if (!arr_photo.get(position).equals("")) { Picasso.with(getActivity()) .load(arr_photo.get(position)) .into(holder.ivUser); } else { holder.ivUser.setImageDrawable(null); } } @Override public int getItemCount() { return arr_userid.size(); } }
No es gran cosa, Pero espero que puedan encontrar las similitudes en ambos métodos y reemplazar su ListView existente con RecyclerView.
La desventaja de RecyclerView es que la creación de un OnClickListener es complicado y la adición de una cabecera y el pie (especialmente una vista loadmore ) es aún más compleja . Voy a hacer otro tutorial sobre que tan pronto como encuentre la manera de hacer eso.
0 comentarios:
Publicar un comentario