Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Adaptador genérico para muchos tipos de fila de presentación de listview en android

Para cada vista de lista con la plantilla de la disposición de la fila de la diferencia, debo crear cada adaptador de encargo, que hago la misma cosa: cargue la disposición de la fila de xml, consiga el control (TextView, ImageView, etc.) por la identificación, exhiba datos … algo como esto :

public class CommentAdapter extends BaseAdapter { protected Activity activity; protected static LayoutInflater layoutInflater = null; protected List<Comment> lst; public CommentAdapter(Activity activity, List<Comment> lst){ this.activity = activity; this.lst = lst; layoutInflater = (LayoutInflater)this.activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } public int getCount() { return lst.size(); } public Object getItem(int position) { return lst.get(position); } public long getItemId(int position) { return position; } public static class ViewHolder{ public TextView textName; public TextView textComment; public ImageView image; } public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; ViewHolder viewHolder; if (v == null) { v = layoutInflater.inflate(R.layout.listitem, null); viewHolder = new ViewHolder(); viewHolder.textName = (TextView) v.findViewById(R.id.txtName); viewHolder.image = (ImageView) v.findViewById(R.id.icon); viewHolder.textComment = (TextView)v.findViewById(R.id.txtComment); v.setTag(viewHolder); } else { viewHolder = (ViewHolder) v.getTag(); } Static.overrideFonts(v); viewHolder.image.setBackgroundResource(lst.get(position).Icon); viewHolder.textName.setText(lst.get(position).Name); viewHolder.textComment.setText(lst.get(position).Comment); return v; } } 

Con muchos tipos de vista de lista (plantilla de la disposición de la fila de la diferencia), tengo que crear muchos adaptadores.
Por lo tanto, la pregunta es que quiero crear un adaptador de plantilla, que puede ser carga dinámica xml línea, base de control de vista de mapa en su id (tal vez utilizar reflejan). El diseño xml de fila, el identificador de control, el control de vista se definirán en otros lugares.
¿Hay algún design pattern , example o framework puede lograr esto?

  • Cómo construir un diseño complejo en android con múltiples vistas de lista
  • Android - Agregar y mostrar elementos a ListView uno a la vez usando un ArrayAdapter
  • CollapsingToolbarLayout problema con GridView
  • ¿Por qué android: listSelector cambia incorrectamente de Actividad a Actividad
  • Adaptador con hasStableIds utilizando GUID o Strings como Ids
  • ¿Cómo evitar que OnItemClickListener trabaje cuando haga clic largo?
  • Necesita ayuda para implementar 47degree Android-SwipeListView
  • Vista de la lista de android
  • 2 Solutions collect form web for “Adaptador genérico para muchos tipos de fila de presentación de listview en android”

    Algo como esto parece factible. No he probado esto en absoluto, pero en teoría podrías salirte con algo como esto:

     public interface Adaptable { //Interface that any object you make that should be put in a listview //should implement public View buildView(View v, LayoutInflater inflater); public int getLayoutId(); } public class MyObject implements Adaptable //Just hardcode your layout for this type of object public int getLayoutId() { return R.layout.myLayout; } //getView() will pass the recycled view to this method //which will handle building the view per this object public View buildView(View v, LayoutInflater inflater) { if(v == null) { v = inflater.inflate(getLayoutId()); //Other initialization } //other initialization return v; } } //Then make the generic adapter that handles anything that implements //the Adaptable interface public GenericAdapter implements ListAdapter { private LayoutInflater inflater; private List<Adaptable> items; public GenericAdapter(List<Adaptable> items, Context c) { this.items = items; inflater = LayoutInflater.from(c); } //Now, using polymorphism, it should return a correctly built //view for whatever object type you've passed in. @Override public View getView(int pos, View convertView, ViewGroup parent) { return items.get(pos).buildView(convertView, inflater); } } public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); List<MyObject> objects = new ArrayList<MyObject>(); //Fill your list however. //get your ListView, then... listView.setAdapter(new GenericAdapter(object, this)); } 

    Es posible que haya olvidado totalmente alguna razón por la que esto no funcionaría. Escribí esto en cinco minutos. En teoría creo que funcionaría, sin embargo.

    He intentado el camino de kcoppock , pero lo hago un poco más complicado.
    En primer lugar, creo un ViewHolder que puede ser mapa con id de vista mediante anotación.

     public class MobileViewHolder { @InvokeView(viewId = R.id.label) public TextView text; @InvokeView(viewId = R.id.logo) public ImageView image; } 

    Entonces, puedo asignar el campo en ViewHolder con la identificación de la visión usando reflejar:

      Field fs[] = viewHolder.getClass().getFields(); for (Field f : fs) { InvokeView a = (InvokeView)f.getAnnotation(InvokeView.class); int id = a.viewId(); f.set(viewHolder, v.findViewById(id)); } 

    Después de eso, sólo vinculando datos de una entidad a ViewHolder.

      public void mappingData(MobileViewHolder viewHolder, Mobile entity) { viewHolder.text.setText(entity.name); viewHolder.image.setBackgroundResource(entity.image); } 

    Conclusión: de esta manera, para muchos tipos de vista de lista que diferencia plantilla de disposición de fila, sólo necesito 4 cosas:

    • Archivo xml de fila
    • ViewHolder: define el control de vista y ve la propiedad
    • Entidad
    • Vista de elemento: extiende el BaseView y los datos de lógica de asignación entre ViewHolder y Entity.

    Y aquí hay una muestra de código fuente que he probado 🙂

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.