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,

  • Wie man ein Bild von links nach rechts in android verschiebt
  • Android: Wie man mehrere Selektoren in einer einzigen XML-Datei schreibt
  • Erzwinge eine Android-Aktivität, um immer den Landschaftsmodus zu benutzen
  • Große Lücke bildet zwischen RecyclerView Items beim Scrollen ab
  • RuntimeException: Fehler beim Aufblasen von Klassenfragmenten
  • Wie kann ich Logcat interpretieren?
  • 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

  • Java.lang.NoClassDefFoundError: Fehlerhafte Auflösung von: Landroid / support / v4 / animation / AnimatorCompatHelper
  • Erweitern Sie den anklickbaren Bereich eines ImageViews mit dem Padding?
  • TaskStackBuilder und Extras für den Back Stack
  • Die Effizienz über die Leinwandzeichnung
  • NanoHttpd-Server kann keine großen Videos auf Android übertragen
  • Wie können wir benachrichtigt werden, wenn das Telefon Internet hat?
  • 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.