android einfügen Wie Sie die gleiche Ansicht mehrfach zum Eltern hinzufügen, indem Sie sie nur einmal aufblasen



title tag länge 2018 (4)

Ich bin nicht sicher, was Ihre Sicht ist, aber haben Sie es manuell über das Aufblasen der XML erstellen:

   ArrayList<String> myList = getData();
    for(String data : myList) {

        LinearLayout layout = new LinearLayout(this);
        layout.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,             LayoutParams.WRAP_CONTENT));
        TextView textView = new TextView(this);
        textView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));

        textView.setText(data);

        layout.addChild(textView);         

        parentPanel.addView(layout);
    }

Aber ja, du versuchst eindeutig etwas, das für dich mit Simple ListView & API

Ich habe ein LinearLayout mit vertikaler Ausrichtung als übergeordnetes Element, ich möchte einige Ansichten programmatisch zu diesem übergeordneten Element hinzufügen. Im Moment blase ich das Kind jedes Mal auf, wenn ich neue Referenzen zu jedem UI-Element bekomme, bevor ich es zum Elternteil hinzufüge. Dies scheint nicht sehr effizient zu sein, gibt es einen besseren Weg, dies zu tun.

Der aktuelle Code, den ich benutze, ist unten. Wenn ich nur einmal vor der Schleife aufblase, erhalte ich einen Laufzeitfehler. "Er hat ein Kind angegeben, das bereits einen Elternteil hat. Sie müssen removeView () zuerst beim Elternteil des Kindes aufrufen."

        LayoutInflater inflator = LayoutInflater.from(getBaseContext());
        LinearLayout parentPanel = findViewById(R.id.parent_pannel);

        ArrayList<String> myList = getData();
        for(String data : myList) {
            // inflate child
            View item = inflator.inflate(R.layout.list_item, null);
            // initialize review UI
            TextView dataText = (TextView) item.findViewById(R.id.data);
            // set data
            dataText.setText(data);
            // add child
            parentPanel.addView(item);
        }

Answer #1

Sie können nicht , selbst wenn Sie versuchen, eine new view aus dem alten view zu erstellen, wird das Objekt durch den Wert reference not übergeben, und daher erhalten Sie eine Exception als childAlreadyHasParent , und die einzige Möglichkeit besteht darin, die view in eine for loop mit der Anzahl der Male, die Sie es aufgeblasen werden möchten, und diese Schleife muss den Erstellungsvorgang von Anfang an nicht nur die Aufblaslinien enthalten.


Answer #2

Das mehrfache Aufblasen kann nicht auf die gleiche Art und Weise durchgeführt werden, wie es in Einzelaufnahmen gemacht wird. Hoffe, das funktioniert

LayoutInflater inflator = (LayoutInflater).getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    LinearLayout parentPanel = findViewById(R.id.parent_pannel);

    ArrayList<String> myList = getData();
    for(String data : myList) {
        // inflate child
        View item = inflator.inflate(R.layout.list_item, null);
        // initialize review UI
        TextView dataText = (TextView) item.findViewById(R.id.data);
        // set data
        dataText.setText(data);
        // add child
        parentPanel.addView(item);
    }

Das wird zumindest bei mir funktionieren


Answer #3

Haben Sie tatsächlich überprüft, ob die Inflation langsam ist? Soweit ich weiß, ist das Aufblasen von Ansichten sehr schnell (fast so schnell wie das manuelle Erstellen von Ansichten).

Es könnte für Sie überraschend sein zu hören, aber inflation tatsächlich analysiert die XMLs überhaupt nicht. XMLs für das Layout werden zur Kompilierungszeit analysiert und vorverarbeitet - sie werden in einer binären Form gespeichert, die die Ansichtsinflation sehr effizient macht (deshalb können Sie eine Ansicht nicht aus einem zur Laufzeit generierten XML aufblähen).