vistas studio layout_inflater_service inflar getlayoutinflater example custom como activity android android-layout android-view android-inflate

android - studio - Cómo inflar varias instancias de un diseño con la misma ID dentro de un diseño inflado



inflate layout in custom view android (3)

Tengo un LinearLayout con muchos LinearLayouts y TextViewss anidados

Mi actividad principal infla el LinearLayout principal,

Luego, cargo datos de un servidor y, según los datos recibidos, agrego varios diseños en un marcador de posición (LinearLayout)

Esta es una página de noticias simple en la que cargo imágenes asociadas con las noticias y las coloco dentro de un LinearLayout inicialmente vacío.

Cada imagen tiene la siguiente información: Título (TextView), Fecha (TextView), Image (ImageView), así que lo que realmente hago es lo siguiente:

* Tenga en cuenta que este es solo el código esencial en la pregunta que eliminé todo el intento -> atrapar ... si / más ... etc.

public void addImages(JSONArray images){ ViewGroup vg = (ViewGroup) findViewById(R.id.imagesPlaceHolder); // loop on images for(int i =0;i<images.length;i++){ View v = getLayoutInflater().inflate(R.layout.image_preview,vg); // then I think that here is the problem ImageView imv = (ImageView) v.findViewById(R.id.imagePreview); TextView dt = (TextView) v.findViewById(R.id.dateHolder); TextView ttl = (TextView) v.findViewById(R.id.title); // then dt.setText("blablabla"); ttl.setText("another blablabla"); // I think the problem is here too, since it''s referring to a single image imv.setTag( images.getJSONObject(i).getString("image_path").toString() ); // then Image Loader From Server or Cache to the Image View } }

El código de arriba funciona bien para una sola imagen.

Pero para varias imágenes, el cargador de imágenes no funciona, supongo que se debe a que todas las vistas de imagen (infladas varias veces) tienen la misma ID.


¿Hay alguna razón por la que ImageView en el diseño XML deba tener una ID? ¿Podría borrar los atributos de android: id del diseño image_preview.xml y luego simplemente repetir a través de los hijos del LinearLayout inflado? Por ejemplo:

ViewGroup v = (ViewGroup)getLayoutInflater().inflate(R.layout.image_preview,vg); ImageView imv = (ImageView) v.getChildAt(0); TextView dt = (TextView) v.getChildAt(1); TextView ttl = (TextView) v.getChildAt(2);


Cuando proporciona un ViewGroup para ser utilizado como padre, la Vista devuelta por inflate() es este padre ( vg en su caso) y no la Vista recién creada. Por lo tanto, v apunta hacia Viewgroup vg y no hacia View creado recientemente y, como todos sus hijos tienen la misma id , las mismas subvistas ( imv , dt , ttl ) se devuelven cada vez.

Dos soluciones. El primero es cambiar su id justo después de que hayas terminado con ellos, antes de la siguiente iteración. Por lo tanto, en la próxima creación al comienzo de la siguiente iteración, las Vistas creadas recientemente tendrán una ID diferente de las Vistas anteriores porque seguirán usando la constante antigua definida en R

La otra solución sería agregar el parámetro falso a la llamada a inflate () para que la vista recién creada no se adjunte a ViewGroup y luego la función inflate () la devuelva en lugar de ViewGroup. El resto de su código funcionará como se atiende, con la excepción de que tendrá que adjuntarlo al Grupo de vista al final de la iteración.

Tenga en cuenta que todavía debe proporcionar un grupo de vistas porque se usará para determinar el valor de los LayoutParams.


Tuve el mismo problema, y ​​basado en la respuesta de @SylvainL, aquí hay una solución de trabajo:

// myContext is, e.g. the Activity. // my_item_layout has a TextView with id=''text'' // content is the parent view (e.g. your LinearLayoutView) // false means don''t add direct to the root View inflated = LayoutInflater.from(myContext).inflate(R.layout.my_item_layout, content, false); // Now, before we attach the view, find the TextView inside the layout. TextView tv = (TextView) inflated.findViewById(R.id.text); tv.setText(str); // now add to the LinearLayoutView. content.addView(inflated);