Intereting Posts
Учебник Javalin дает «Неразрешенные ссылки: AtomicInteger» Google Guava Invokedynamic требует –min-sdk-version> = 26 smart cast невозможно, потому что экземпляр является изменяемым свойством Поведение прокрутки списка вложенных списков в Android Доступ к полю другого экземпляра того же класса в Котлине Firebase Storage OnsuceessListner в котлин не показывается Есть ли способ переопределить свойство setter в расширяющемся классе в Котлине Kotlin: Intrinsics.areEqual бесконечный цикл (переполнение стека) Kotlin – переопределить / реализовать функцию доступа к массиву Kotlin – Как сделать поле только для чтения для внешних классов Как использовать Anko DSL внутри фрагмента? Работа Gradle работает на локальной машине, но не работает на сервере Jenkins CI? «Java» «не распознается как внутренняя или внешняя команда, программный или командный файл. в Котлине Референциальное и структурное равенство в Котлине Конвертировать проект Android для использования Gradle Script Kotlin

Как установить параметры макета в 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» следует заменить родительским представлением вашего изображения.

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