Cómo establecer los parameters de layout en una imageView dentro de GridView en Android

Soy nuevo en Android y conocí este tutorial en el sitio oficial de Android sobre cómo crear una GridView de imágenes. Estoy usando kotlin como el idioma de elección. En la class de adaptador que amplía BaseAdapter , estoy tratando de configurar los layoutparams de la vista de image como se indica en el tutorial, pero aparece un error que dice que GridView.LayoutParams es una reference no resuelta. Aquí está el código completo para la class:

 class ImageAdapter(val context: Context) : BaseAdapter() { // references to our images val items: IntArray = intArrayOf(R.drawable.cat, R.drawable.daft_punk, R.drawable.gun, R.drawable.harvestors, R.drawable.intel, R.drawable.maserati, R.drawable.porsche, R.drawable.serveroom, R.drawable.spiderman, R.drawable.watch_dog) override fun getItem(p0: Int): Any { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } override fun getItemId(p0: Int): Long { return 0 } override fun getCount(): Int { return items.size } // create a new ImageView for each item referenced by the Adapter override fun getView(p0: Int, p1: View?, p2: ViewGroup?): View { var imageView: ImageView if (p1 == null) { // if it's not recycled, initialize some attributes imageView= ImageView(context) imageView.layoutParams= GridView.LayoutParams(85,85) imageView.scaleType = ImageView.ScaleType.CENTER_CROP imageView.setPadding(8, 8, 8, 8) } else { imageView=p1 as ImageView } imageView.setImageResource(items[p0]) return imageView } } 

El error está en el método getView en la línea imageView.layoutParams=GridView.LayoutParams(85,85) . LayoutParams está en rojo, lo que significa error, y cuando cierro sobre él, aparece el post:

Referencia no resuelta: LayoutParams

¿Cómo configuro estos LayoutParams ? Porque sin ellos, las imágenes en el GridView se muestran en toda su altura y necesito una image pequeña de la misma manera que la aplicación de la galería las muestra en nuestros teléfonos.

Pregunta posterior:

Cuando reemploop el imageView.layoutParams=GridView.LayoutParams(85,85) con imageView.layoutParams=AbsListView.LayoutParams(85,85) , obtengo un error de javaOutOfMemory. El siguiente es el seguimiento completo de la stack:

 08-16 06:58:11.412 4543-4543/gallerie.classmite.com.imageviewer E/dalvikvm-heap: Out of memory on a 18662416-byte allocation. 08-16 06:58:11.431 4543-4543/gallerie.classmite.com.imageviewer E/AndroidRuntime: FATAL EXCEPTION: main Process: gallerie.classmite.com.imageviewer, PID: 4543 java.lang.OutOfMemoryError at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:609 at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:444) at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:840) at android.content.res.Resources.loadDrawable(Resources.java:2166) at android.content.res.Resources.getDrawable(Resources.java:710) at android.widget.ImageView.resolveUri(ImageView.java:638) at android.widget.ImageView.setImageResource(ImageView.java:367) at gallerie.classmite.com.imageviewer.ImageAdapter.getView(ImageAdapter.kt:32) at android.widget.AbsListView.obtainView(AbsListView.java:2372) at android.widget.GridView.makeAndAddView(GridView.java:1345) at android.widget.GridView.makeRow(GridView.java:345) at android.widget.GridView.fillDown(GridView.java:287) at android.widget.GridView.fillFromTop(GridView.java:421) at android.widget.GridView.layoutChildren(GridView.java:1233) at android.widget.AbsListView.onLayout(AbsListView.java:2166) at android.view.View.layout(View.java:15127) at android.view.ViewGroup.layout(ViewGroup.java:4862) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1888) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1742) at android.widget.LinearLayout.onLayout(LinearLayout.java:1651) at android.view.View.layout(View.java:15127) at android.view.ViewGroup.layout(ViewGroup.java:4862) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:515) at android.widget.FrameLayout.onLayout(FrameLayout.java:450) at android.view.View.layout(View.java:15127) at android.view.ViewGroup.layout(ViewGroup.java:4862) at com.android.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:374) at android.view.View.layout(View.java:15127) at android.view.ViewGroup.layout(ViewGroup.java:4862) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:515) at android.widget.FrameLayout.onLayout(FrameLayout.java:450) at android.view.View.layout(View.java:15127) at android.view.ViewGroup.layout(ViewGroup.java:4862) at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2315) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2021) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1189) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6221) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:788) at android.view.Choreographer.doCallbacks(Choreographer.java:591) at android.view.Choreographer.doFrame(Choreographer.java:560) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:774) at android.os.Handler.handleCallback(Handler.java:808) at android.os.Handler.dispatchMessage(Handler.java:103) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:5315) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:829) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:645) at dalvik.system.NativeStart.main(Native Method) 

El error solo ocurre cuando ejecuto la aplicación en mi teléfono, pero cuando ejecuto la aplicación en el emulador, funciona sin problemas después de hacer el reemploop anterior.

Puedes probar con esto:

 imageView.layoutParams = AbsListView.LayoutParams(85, 85) 

AbsListView.LayoutParams se utiliza en GridView al recuperar los LayoutParams los elementos LayoutParams .

Dado que el miembro estático se puede henetworkingar por subclass en Java . Cuando llamas a GridView.LayoutParams , en realidad es AbsListView.LayoutParams . Sin embargo, en Kotlin, no puedes hacerlo de la misma manera. Fuera de la subclass, solo puede hacer reference a los miembros del object acompañante de la superclass utilizando el nombre de superclass.

Actualizaciones para la pregunta posterior:

El error OutOfMemory indica que está cargando una image grande en ImageView . Para evitar esto, debe networkingucir la escala de la image antes de mostrarla, haciendo reference a este tutorial . También puede usar algún marco de carga de imágenes, como Glide , para visualizar su image.

Lectura sugerida: Extraño problema de falta de memory al cargar una image en un object Bitmap

No configure los parameters de layout como lo hizo

la forma correcta es imageParams = (GridView.LayoutParams) imageView.getLayoutParams ();

en la línea anterior, "GridView" debe replacese con la vista principal de su imageView

Feliz encoding … 🙂

  • Click listener en ViewHolder solo responde a veces
  • No se puede enviar datos de formulario / múltiples con Volley
  • Propiedad de Kotlin: "El parámetro de tipo de una propiedad debe usarse en su tipo de receptor"
  • Simplificado agregar y replace fragments en Kotlin
  • ¿Cómo iniciar session dentro de la function de filter de Kotlin?
  • Crear file ZIP en Kotlin
  • Hubo un error al procesar los informes de cobertura en codecov
  • Obteniendo java.lang.VerifyError al hacer una request de cadena usando Android Volley en Kotlin
  • Llamando a un método con param nulo
  • Prueba de unidad de complemento IDEA Intellij (dependencies de proyecto de testing)
  • retroajuste + desnerializador gson: retorno dentro de la matriz