Как установить параметры макета в imageView внутри GridView в Android

Я новичок в андроиде, и я познакомился с этим учебным пособием на официальном сайте android о том, как создать GridView изображений. Я использую kotlin как язык выбора. В классе адаптера, который расширяет BaseAdapter , я пытаюсь установить шаблоны layoutview изображения, как указано в учебнике, но я получаю сообщение об ошибке, когда GridView.LayoutParams является нерешенной ссылкой. Вот полный код для класса:

 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 } } 

Ошибка в методе getView в строке imageView.layoutParams=GridView.LayoutParams(85,85) . LayoutParams находится в красном цвете, что означает ошибку, и когда я наводил на него курсор, я получаю сообщение:

Неразрешенная ссылка: LayoutParams

Как успешно установить эти LayoutParams ? Потому что без них изображения в GridView отображаются на полной высоте, и мне нужно небольшое изображение так же, как приложение галереи отображает их на наших телефонах.

Последующий вопрос:

Когда я заменяю imageView.layoutParams=GridView.LayoutParams(85,85) с помощью imageView.layoutParams=AbsListView.LayoutParams(85,85) , я получаю ошибку javaOutOfMemory. Ниже приведена полная трассировка стека:

 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) 

Ошибка возникает только при запуске приложения в телефоне, но когда я запускаю приложение в эмуляторе, он работает безупречно после того, как я сделал замену выше.

Вы можете попробовать:

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

AbsListView.LayoutParams используется в GridView при извлечении LayoutParams .

Поскольку статический член может быть унаследован подклассом в Java . Когда вы вызываете GridView.LayoutParams , это фактически AbsListView.LayoutParams . Однако в Котлине вы не можете сделать то же самое. Вне подкласса вы можете ссылаться только на участников сопутствующего объекта суперкласса, используя имя суперкласса.

Обновления для последующего вопроса:

Ошибка OutOfMemory указывает, что вы загружаете большое изображение в ImageView . Чтобы предотвратить это, вы должны уменьшить изображение до его отображения, ссылаясь на этот учебник . Вы можете также использовать некоторые рамки загрузки изображений, такие как Glide , для отображения вашего изображения.

Предлагаемое чтение: странная проблема с памятью при загрузке изображения в объект Bitmap

Не задавайте параметры макета, как и вы

правильным способом является imageParams = (GridView.LayoutParams) imageView.getLayoutParams ();

в приведенной выше строке «GridView» следует заменить родительским представлением вашего изображения.

Счастливое кодирование .. 🙂