【问题标题】:How to set layout params on an imageView inside GridView in Android如何在 Android 的 GridView 内的 imageView 上设置布局参数
【发布时间】:2017-08-16 01:25:00
【问题描述】:

我是 android 新手,我在 the official android site 遇到了这个关于如何创建 GridView 图像的教程。我使用 kotlin 作为首选语言。在扩展 BaseAdapter 的适配器类中,我试图按照教程中的说明设置 imageview 布局参数,但我收到一条错误消息,指出 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
    }

}

错误在于imageView.layoutParams=GridView.LayoutParams(85,85) 行的getView 方法。 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 中加载的图像尺寸是多少?
  • 最大的几乎是 2MB,大多数小于 1MB...当我加载许多较小的图像时说总共超过 15 个,我得到同样的错误
  • 尝试使用 Glide 库 github.com/bumptech/glide。与位图缓存和池一起实现非常容易,并且可以轻松处理您的用例。
  • 好的..一定会试一试的..

标签: android gridview out-of-memory kotlin


【解决方案1】:

你可以试试这个:

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

AbsListView.LayoutParams 在检索孩子的LayoutParams 时用于GridView

因为静态成员可以被子类in Java 继承。当您调用GridView.LayoutParams 时,它实际上是AbsListView.LayoutParams。但是,在 Kotlin 中,您不能以同样的方式进行操作。在子类之外,只能使用超类的名称来引用超类的伴生对象的成员。

后续问题的更新:

OutOfMemory 错误表示您正在将大图像加载到ImageView。为了防止这种情况,您必须在显示之前缩小图像,参考这个tutorial。你也可以使用一些图片加载框架,比如Glide,来展示你的图片。

推荐阅读:Strange out of memory issue while loading an image to a Bitmap object

【讨论】:

  • else 语句的右大括号出现java.lang.OutOfMemoryError 错误..
  • 这应该是另一个问题。你有关于它的完整堆栈跟踪吗?您可以更新有关此新问题的问题。
  • 如果你的图片资源太大,你可以参考this或者想办法得到一个调整大小的位图,然后再传给ImageView
  • 我认为问题出在图像上。当我在模拟器中运行应用程序时,它可以工作,可能是因为计算机不像手机那样对 RAM 没有限制......我所做的是使用占用更少内存的较小图像并且它已经工作......我想自己制作图库应用程序的版本,这意味着图像(无论它们有多大)都托管在手机文件管理器中,而不是可绘制的文件夹中。如果我从手机中获取图像,您认为可能会面临内存问题吗?
  • 在Android中处理图像时很容易遇到内存问题。为防止这种情况,您必须在显示之前scale down 图像。您可能还会看到一些建议here
【解决方案2】:

不要像你那样设置布局参数

正确的方法是 imageParams=(GridView.LayoutParams) imageView.getLayoutParams();

上面的“GridView”应该替换为你的imageView的父视图

编码愉快.. :)

【讨论】:

    猜你喜欢
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 2014-02-19
    • 1970-01-01
    • 2014-02-19
    • 1970-01-01
    相关资源
    最近更新 更多