1

I was trying to practice to use GridView in Android Studio, I don't know why I keep getting this exception.

Here is the code of my main class.

public class MainActivity extends AppCompatActivity {
private GridView turtle;
private List<Map<String,Object>> datalist;
private int[] icon = {R.drawable.address_book,R.drawable.calendar,R.drawable.camera,R.drawable.clock,R.drawable.games_control,R.drawable.messenger,R.drawable.ringtone,R.drawable.settings,R.drawable.speech_balloon,R.drawable.weather,R.drawable.world,R.drawable.youtube};
private String  [] iconName = {"Contackt","Calendar","Camera","Clock","game","messager","ring","setting","voice","weather","browser","video"};
private SimpleAdapter adapter;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    turtle = (GridView) findViewById(R.id.turtle);
    datalist = new ArrayList<Map<String,Object>>();
    adapter = new SimpleAdapter(this,getdata(),R.layout.item,new String[]{"pic","txt"}, new int[]{R.id.pic,R.id.text});
    turtle.setAdapter(adapter);
}
private  List<Map<String,Object>> getdata(){
    for(int i = 0; i<icon.length;i++) {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("pic", icon[i]);
        map.put("text",iconName[i]);
        datalist.add(map);


    }


    return datalist;
}
}

Here is the code of my main XML file

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.jinyu.gridleview.MainActivity">

<GridView
    android:numColumns="3"
    android:verticalSpacing="10dp"
    android:horizontalSpacing="10dp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/turtle"
    android:layout_centerVertical="true"
    android:layout_centerHorizontal="true" />
</RelativeLayout>

Here is the code of my item layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000000"
android:gravity="center"
>
<ImageView
    android:src="@drawable/ic_launcher"
    android:id="@+id/pic"
    android:layout_width="60dp"
    android:layout_height="60dp" />
<TextView
    android:layout_marginTop="5dp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textColor="#ffffff"
    android:id="@+id/text"
    android:text="text"
    android:textSize="12dp"/>


</LinearLayout>

My log:

04-13 21:14:21.940 2558-2558/com.example.jinyu.gridleview E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.jinyu.gridleview, PID: 2558 java.lang.OutOfMemoryError: Failed to allocate a 9437196 byte allocation with 4194304 free bytes and 8MB until OOM at dalvik.system.VMRuntime.newNonMovableArray(Native Method) 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:1080) at android.content.res.Resources.loadDrawableForCookie(Resources.java:2635) at android.content.res.Resources.loadDrawable(Resources.java:2540) at android.content.res.Resources.getDrawable(Resources.java:806) at android.content.Context.getDrawable(Context.java:458) at android.widget.ImageView.resolveUri(ImageView.java:811) at android.widget.ImageView.setImageResource(ImageView.java:418) at android.widget.SimpleAdapter.setViewImage(SimpleAdapter.java:276) at android.widget.SimpleAdapter.bindView(SimpleAdapter.java:226) at android.widget.SimpleAdapter.createViewFromResource(SimpleAdapter.java:133) at android.widget.SimpleAdapter.getView(SimpleAdapter.java:121) at android.widget.AbsListView.obtainView(AbsListView.java:2346) at android.widget.GridView.makeAndAddView(GridView.java:1439) at android.widget.GridView.makeRow(GridView.java:366) at android.widget.GridView.fillDown(GridView.java:307) at android.widget.GridView.fillFromTop(GridView.java:442) at android.widget.GridView.layoutChildren(GridView.java:1304) at android.widget.AbsListView.onLayout(AbsListView.java:2148) at android.view.View.layout(View.java:16630) at android.view.ViewGroup.layout(ViewGroup.java:5437) at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1079) at android.view.View.layout(View.java:16630) at android.view.ViewGroup.layout(ViewGroup.java:5437) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336) at android.widget.FrameLayout.onLayout(FrameLayout.java:273) at android.view.View.layout(View.java:16630) at android.view.ViewGroup.layout(ViewGroup.java:5437) at android.support.v7.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:493) at android.view.View.layout(View.java:16630) at android.view.ViewGroup.layout(ViewGroup.java:5437) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336) at android.widget.FrameLayout.onLayout(FrameLayout.java:273) at android.view.View.layout(View.java:16630) at android.view.ViewGroup.layout(ViewGroup.java:5437) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1586) at android.widget.LinearLayout.onLayout(LinearLayout.java:1495) at android.view.View.layout(View.java:16630) at android.view.ViewGroup.layout(ViewGroup.java:5437) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336) at android.widget.FrameLayout.onLayout(FrameLayout.java:273) at com.android.internal.policy.PhoneWindow$DecorView.onLayout(PhoneWindow.java:2678) at android.view.View.layout(View.java:16630) at android.view.ViewGroup.layout(ViewGroup.java:5437) at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2171) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1931) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) at android.view.Choreographer.doCallbacks(Choreographer.java:670) at android.view.Choreographer.doFrame(Choreographer.java:606) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at c

Suhas Bachewar
  • 1,234
  • 7
  • 20
Josiah Wu
  • 65
  • 11
  • Show you adapter code. – vabhi vab Apr 14 '16 at 04:25
  • adapter = new SimpleAdapter(this,getdata(),R.layout.item,new String[]{"pic","txt"}, new int[]{R.id.pic,R.id.text}); this one? – Josiah Wu Apr 14 '16 at 04:26
  • Issue is of Outofmemory not an adapter. have you mention large Heap in android manifiest. – Suhas Bachewar Apr 14 '16 at 04:30
  • Do i have too? Cuz I was just follow a tutorial and it doesn't said that I need to. – Josiah Wu Apr 14 '16 at 04:36
  • yes can you have to add android:largeHeap="true" in side Android Manifiest . – Suhas Bachewar Apr 14 '16 at 04:38
  • But why we need to give largerHeap="true" for a small data. Something else is wrong. Are you running this app in Virtual device ? – vabhi vab Apr 14 '16 at 04:39
  • Tell me what is your each image size mention in icon array list ? If each image of size more then it crashes as mention n Log. Your code works find and my end i have used image of 400 KB in icon arraylist – Suhas Bachewar Apr 14 '16 at 04:51
  • the size of each image is 20kb. yeah, I did run this app in VD – Josiah Wu Apr 14 '16 at 04:54
  • Yes You can run any where AVD or Virtual Device(Genymotion ) or try to run on real device. My virtual device Screen shot : http://tinypic.com/view.php?pic=25s0mfq&s=9#.Vw8i23V953U . – Suhas Bachewar Apr 14 '16 at 04:57
  • You can try by editing configuration of your AVD. and increase size of memory there. or try in a real device. If you code is correct. then it will definitely work in hardware device. – vabhi vab Apr 14 '16 at 05:07
  • I did increase the size of the memory of my AVD, but I still kept getting this exception – Josiah Wu Apr 14 '16 at 05:21
  • @JosiahWu Have you tried on Real Device and made change in Android Manifest android:largeHeap="true" ? – Suhas Bachewar Apr 14 '16 at 05:38
  • Did you increased Heap size as well ? if yes, then run it on hardware device. in some cases AVD gives problem. or you can try genymotion. – vabhi vab Apr 14 '16 at 05:41
  • I did increase the heap size, I think I am going to try on my device. – Josiah Wu Apr 14 '16 at 05:55
  • Yes, i faced same problem. but i usually use hardware device. so it worked on hardware device. if you are learning android now. Learn RecyclerView and give its Layout as StaggeredGridView. that also a good way to create gridView. – vabhi vab Apr 14 '16 at 05:59
  • Thanks guys, I solve problem by running this app on my phone. – Josiah Wu Apr 14 '16 at 22:42

2 Answers2

0

You can't increase the heap size dynamically but you can request to use more by using.

android:largeHeap="true"

in the manifest.xml.

https://stackoverflow.com/a/25719828/4853552

Community
  • 1
  • 1
Shubham Jain
  • 2,257
  • 2
  • 16
  • 28
  • I did follow your instruction, but I kept getting java.lang.OutOfMemoryError: Failed to allocate a 9437196 byte allocation with 4194304 free bytes and 8MB until 00M – Josiah Wu Apr 14 '16 at 05:18
0

Thanks guys, I solve problem by running this app on my phone.

Josiah Wu
  • 65
  • 11