Cómo agregar la misma vista a los padres varias veces inflando sólo una vez

Tengo un LinearLayout con la orientación vertical como padre, quiero agregar alguna vista programáticamente varias veces a este padre. En este momento estoy inflando al niño cada vez que recibo nuevas referencias a cada elemento de la interfaz de usuario antes de agregar a los padres. Esto no parece ser muy eficiente, hay alguna manera mejor de hacer esto.

El código actual que estoy usando está por debajo, si solo hinco una vez antes para obtener el bucle error de tiempo de ejecución "especificó que el niño ya tiene un padre. Debe llamar a removeView () al padre del niño primero."

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 comprobó si el inflado es lento? Por lo que yo sé, inflar vista es muy rápido (casi tan rápido como crear vistas manualmente).

Podría ser sorprendente para que usted pueda oír, pero inflar de hecho no analizar los XML en absoluto. Los XML para el diseño se analizan y pre-procesan en tiempo de compilación – se almacenan en un formulario binario que hace que la inflación de vista sea muy eficiente (por eso no se puede inflar una vista desde un XML generado en tiempo de ejecución).

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

No estoy seguro de cuál es su punto de vista, pero tiene que crear manualmente a través de 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í su claramente intentar algo que se ha hecho para usted con Simple ListView y API

Inflar varias veces no se puede hacer de la misma manera 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ó

  • Cómo configurar RecyclerView en el widget android
  • Android: removeMessages (int what = 107) no está soportado antes de que WebViewCore esté configurado cuando url contenga http
  • No se puede resolver el símbolo 'NavigationView'
  • Android hacer desaparecer la vista haciendo clic fuera de ella
  • ¿Cómo extender la vista de la disposición del cajón?
  • Establecer gravedad de una vista mediante programación
  • El niño especificado ya tiene un padre
  • Android - Creación de listview con encabezados flotantes
  • ¿Por qué se crea un FrameLayout extra para fragmentos?
  • Cómo cambiar android SearchView text
  • Cómo configurar el adaptador para searchview en la barra de acciones
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.