Android: Reutilización de vistas incrustadas en gridview

Estoy tratando de reutilizar un framelayout que tiene una imagen y textview dentro de él pero no creo que estoy haciendo esto a la derecha. El código funciona y la pantalla es correcta, pero el rendimiento es muy pobre y creo que es porque estoy creando un nuevo ImageView y TextView cada vez que los adaptadores vuelve a la posición del artículo.

¿Puede alguien decirme cómo reutilizar el ImageView incorporado (llamado i) y TextView (llamado t) sin crear nuevos objetos? Soy muy nuevo en Java y este es mi intento de construir una aplicación para Android.

public View getView(int position, View convertView, ViewGroup parent) { FrameLayout F; FrameLayout ImageBorder; FrameLayout TextBG; ImageView i; TextView t; if(convertView == null) { F = new FrameLayout(mContext); } else { F = (FrameLayout) convertView; } ImageBorder = new FrameLayout(F.getContext()); FrameLayout.LayoutParams params1 = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.FILL_PARENT,300,Gravity.BOTTOM); ImageBorder.setLayoutParams(params1); i = new ImageView(F.getContext()); TextBG = new FrameLayout(F.getContext()); t = new TextView(F.getContext()); F.setBackgroundColor(Color.BLACK); ImageBorder.setPadding(2, 2, 2, 2); ImageBorder.setBackgroundColor(Color.BLACK); FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.FILL_PARENT,40,Gravity.BOTTOM); TextBG.setLayoutParams(params); TextBG.setBackgroundColor(Color.BLACK); TextBG.setAlpha(.6f); t.setLayoutParams(params); t.setGravity(Gravity.CENTER_VERTICAL); String pathToPhoto = FileList.get(position).toString(); String fileDescription = pathToPhoto.replaceAll("/mnt/external1/PaliPhotography/",""); fileDescription = fileDescription.replaceAll(".jpg",""); fileDescription = fileDescription.toUpperCase(); Bitmap bm = Cache.getCacheFile("thumb",pathToPhoto); if (bm == null) { ImageDownloader downloader = new ImageDownloader(i); downloader.execute("thumb", pathToPhoto, "400", "400"); } else { i.setImageBitmap(bm); i.setScaleType(ImageView.ScaleType.CENTER_CROP); t.setTextAppearance(getApplicationContext(), android.R.style.TextAppearance_Large); t.setText(" " + fileDescription); } ImageBorder.addView(i); ImageBorder.addView(TextBG); ImageBorder.addView(t); F.addView(ImageBorder); return F; } } 

¡Gracias de antemano!

[EDITAR]

————————— SOLUCIÓN ———————- ——————————-

¡Aquí está la solución que implementé basado en la regeneración abajo! ¡Gracias!

  public View getView(int position, View convertView, ViewGroup parent) { View ReturnThisView; ViewHolder holder; LayoutInflater inflater; holder = new ViewHolder(); if(convertView == null) { inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); ReturnThisView = inflater.inflate(R.layout.imagecell, null); ReturnThisView.setTag(holder); } else { ReturnThisView = convertView; } holder.TextDescription = (TextView) ReturnThisView.findViewById(R.id.PhotoDesc); holder.ImageThumbnail = (ImageView) ReturnThisView.findViewById(R.id.Thumbnail); String pathToPhoto = FileList.get(position).toString(); String fileDescription = pathToPhoto.replaceAll("/mnt/external1/PaliPhotography/",""); fileDescription = fileDescription.replaceAll(".jpg",""); fileDescription = fileDescription.toUpperCase(); Bitmap bm = Cache.getCacheFile("thumb",pathToPhoto); if (bm == null) { ImageDownloader downloader = new ImageDownloader(holder.ImageThumbnail); downloader.execute("thumb", pathToPhoto, "400", "400"); } else { holder.ImageThumbnail.setImageBitmap(bm); holder.ImageThumbnail.setScaleType(ImageView.ScaleType.CENTER_CROP); holder.TextDescription.setTextAppearance(getApplicationContext(), android.R.style.TextAppearance_Large); holder.TextDescription.setText(" " + fileDescription); } return ReturnThisView; } } static class ViewHolder { TextView TextDescription; ImageView ImageThumbnail; } 

    2 Solutions collect form web for “Android: Reutilización de vistas incrustadas en gridview”

    1. En lugar de crear dinámicamente su vista para cada elemento, cree un archivo de diseño XML, digamos row.xml.
    2. Si detecta que convertView == null infla nueva fila utilizando inflater
    3. Busque su TextView y ImageView usando View # findViewById
    4. Cree un objeto Holder que le ayudará a mantener referencias a sus recientemente encontrados TextView y ImageView
    5. Guardar el titular como una etiqueta para convertView.setTag(holder)
    6. Para existente convertView encontrar el objeto Holder haciendo holder = convertView.getTag()
    7. Establecer texto e imagen para estos dos objetos guardados, por ejemplo, holder.txt.setText("Foo")
    8. Adaptador de Android hará el resto en la medida en la reutilización de instancias de filas hinchadas

    Discutible incluso para su código usted puede hacer la inicialización y la disposición de la visión una vez y utilizar el patrón del sostenedor para evitar la re-inicialización de los elementos pero pienso que XML le dará una mejor experiencia

    La solución que usted proporcionó no es exacta. El ViewHolder se utiliza principalmente para evitar inflar la vista y llamar a findViewById () más de una vez.

    En su código,

    • ¡No debe crear un nuevo objeto de soporte cada vez! En su lugar, debe crear un nuevo visor sólo cuando su convertView = null, a continuación, guárdelo en la etiqueta ReturnThisView. Si el convertidor no es nulo, debe cargar el visor que guardó anteriormente.

    • Evitó inflar la vista, tan bien hecho (y), pero todavía utiliza findViewById (). Sólo use findViewById () cuando convertView = null y está inicializando las vistas en el titular de la vista. Si convertView no es nulo, simplemente utilice las vistas guardadas en el objeto viewHolder que ha cargado.

    Aquí hay un ejemplo:

      public View getView(int position, View convertView, ViewGroup parent) { View ReturnThisView; ViewHolder holder; LayoutInflater inflater; if(convertView == null) { inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); ReturnThisView = inflater.inflate(R.layout.imagecell, null); holder = new ViewHolder(); holder.TextDescription = (TextView) ReturnThisView.findViewById(R.id.PhotoDesc); holder.ImageThumbnail = (ImageView) ReturnThisView.findViewById(R.id.Thumbnail); ReturnThisView.setTag(holder); } else { ReturnThisView = convertView; holder = (ViewHolder)ReturnThisView.getTag(); } String pathToPhoto = FileList.get(position).toString(); String fileDescription = pathToPhoto.replaceAll("/mnt/external1/PaliPhotography/",""); fileDescription = fileDescription.replaceAll(".jpg",""); fileDescription = fileDescription.toUpperCase(); Bitmap bm = Cache.getCacheFile("thumb",pathToPhoto); if (bm == null) { ImageDownloader downloader = new ImageDownloader(holder.ImageThumbnail); downloader.execute("thumb", pathToPhoto, "400", "400"); } else { holder.ImageThumbnail.setImageBitmap(bm); holder.ImageThumbnail.setScaleType(ImageView.ScaleType.CENTER_CROP); holder.TextDescription.setTextAppearance(getApplicationContext(), android.R.style.TextAppearance_Large); holder.TextDescription.setText(" " + fileDescription); } return ReturnThisView; } } static class ViewHolder { TextView TextDescription; ImageView ImageThumbnail; 

    }

    Lo aprendí desde este sitio .

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.