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.