Wie man mehrere Instanzen eines Layouts mit der gleichen ID in einem aufgeblasenen Layout aufzublasen

Ich habe ein LinearLayout mit vielen verschachtelten LinearLayouts und TextViewss

Meine Haupttätigkeit löst die Hauptlinie von LinearLayout,

Dann lade ich Daten von einem Server und basierend auf den empfangenen Daten, füge ich mehrere Layouts in einem Platzhalter (LinearLayout)

Dies ist einfach eine News-Seite, wo ich Bilder geladen, die mit den Nachrichten verknüpft sind, und legen Sie sie in eine anfänglich leere LinearLayout.

Jedes Bild hat folgende Informationen: Titel (TextView), Datum (TextView), Bild (ImageView) so was ich eigentlich tue, ist folgendes:

* Bitte beachten Sie, dass dies nur das Wesentliche codiert in der Frage, die ich elemenated alle versuchen -> catch … if / else …. 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 } } 

Der Code oben funktioniert gut für ein einziges Bild

Aber für mehrfache Bilder funktioniert der Image Loader nicht, ich denke, es ist, weil alle ImageViews (mehrmals aufgepasst) die gleiche ID haben

  • Oberste Ansicht schluckt Berührungsereignisse durch Überlappung
  • Wie bekomme ich alle Kinder (sichtbar und unsichtbar) aus einer ListView?
  • ListView mit dreieckig geformten Gegenständen
  • Wie können Sie Android SnackBar an eine bestimmte Position auf dem Bildschirm anpassen
  • Muss einer von: View.VISIBLE, View.INVISIBLE, View.GONE
  • Durchführen von Prise Zoom und Ziehen mit Android's Build in Gesten Zuhörer und Skala Zuhörer
  • Android schwimmende Tasten über eine Ansicht
  • Android - listview erhalten Artikelansicht nach Position
  • 3 Solutions collect form web for “Wie man mehrere Instanzen eines Layouts mit der gleichen ID in einem aufgeblasenen Layout aufzublasen”

    Gibt es einen Grund, warum die ImageView im Layout-XML eine ID haben muss? Könnten Sie das Android löschen: id Attribute aus dem image_preview.xml Layout und dann einfach durch die Kinder der aufgeblasenen LinearLayout iterieren? Beispielsweise:

     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); 

    Wenn Sie eine ViewGroup zur Verfügung stellen, die als übergeordnetes Element verwendet werden soll, ist die von inflate() Ansicht diese übergeordnete ( vg in Ihrem Fall) und nicht die neu erstellte Ansicht. Daher weist v auf die ViewGroup vg und nicht auf die neu erstellte Ansicht zu und da alle deine Kinder die gleiche id , werden die gleichen Subviews ( imv , dt , ttl ) jedes Mal zurückgegeben.

    Zwei Lösungen. Die erste ist, ihre id zu ändern, nachdem du mit ihnen fertig bist, vor der nächsten Iteration. Daher wird bei der nächsten Erstellung zu Beginn der nächsten Iteration die neu erstellten Ansichten eine andere IDs aus den älteren Ansichten haben, weil sie immer noch die in R definierte alte Konstante verwenden.

    Die andere Lösung wäre, den Parameter false zu dem Aufruf zu aufblasen () hinzuzufügen, damit die neu erstellte Ansicht nicht an die ViewGroup angehängt wird und dann von der inflate () – Funktion anstelle der ViewGroup zurückgegeben wird. Der Rest Ihres Codes wird dann mit der Ausnahme bearbeitet, dass Sie sie an die ViewGroup am Ende der Iteration anhängen müssen.

    Beachten Sie, dass Sie noch eine ViewGroup angeben müssen, da es verwendet wird, um den Wert der LayoutParams zu bestimmen.

    Ich hatte das gleiche Problem und basiere auf der Antwort von @SylvainL, hier eine Arbeitslösung:

     // myContext is, eg the Activity. // my_item_layout has a TextView with id='text' // content is the parent view (eg 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); 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.