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 … 🙂

  • Inferencia incorrecta para el parámetro de tipo reificado en Kotlin
  • El uso de los colors definidos en el module base del module de características falla después de rebuild la aplicación Android Instant
  • "Lateinit" o "by perezoso" cuando se define global android.widget var / val
  • Android: obteniendo IllegalAccessError solo en APK incorporados
  • ¿Cómo diferenciar entre una reference de miembro llamable encuadernada y una function del mismo tipo en kotlin?
  • El layout SwitchPreference no es correcto hasta que se toca
  • ¿Cómo agregar extensión de operador como parte del context de la class específica sin subclasss?
  • Kotlin val difference getter override vs assignment
  • Android: el calendar especial de Java / Kotlin aparece
  • ¿Es posible usar Mockito en Kotlin?
  • Comstackción manual de JAR para Scala & Kotlin