texto studio open links link android layout view add inflate

open - texto link android studio



Cómo agregar la misma vista al padre varias veces inflándola solo una vez (4)

Tengo un LinearLayout con orientación vertical como principal, quiero agregar algunas vistas programáticamente varias veces a este elemento primario. En este momento estoy inflando al niño cada vez que obtengo nuevas referencias a cada elemento de la interfaz de usuario antes de agregar al padre. Esto no parece ser muy eficiente, ¿hay alguna forma mejor de hacerlo?

El código actual que estoy usando es el siguiente, si solo inflico una vez antes para el ciclo obtengo un error de tiempo de ejecución "el hijo especificado ya tiene un padre. Primero debe llamar a removeView () en el padre del niño."

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


¿Realmente verificaste si el inflado es lento? Hasta donde yo sé, inflar la vista es muy rápido (casi tan rápido como crear vistas manualmente).

Puede ser sorprendente para usted escuchar, pero inflar de hecho no analiza los XML en absoluto. Los XML para el diseño se analizan y preprocesan en tiempo de compilación: se almacenan en una forma binaria que hace que el inflado de la vista sea muy eficiente (es por eso que no se puede inflar una vista desde un XML generado en tiempo de ejecución).


Inflar varias veces no se puede hacer de la misma manera que hacerlo en una sola toma. Espero que esto funcione

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

Esto funcionará, al menos me funcionó


No estoy seguro de cuál es tu vista, pero tienes que crearla manualmente sobre inflar el XML:

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

Pero sí estás intentando claramente algo que se haya hecho por ti con Simple ListView y API


No puede , incluso si intenta crear una new view desde el objeto de view anterior view el objeto se pasará por referencia, no por valor, y, por lo tanto, obtendrá una Excepción como childAlreadyHasParent , y entonces, la única manera es poner el view en un for loop con la cantidad de veces que desea que se infla, y este bucle debe contener el proceso de creación desde el principio no solo las líneas de inflado.