title: Android Class Cast Exception: android.view.ViewGroup$LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
body: <p>I've been having trouble debugging an Android application I'm working on. At it's current point, it should be able to take an input from a text file (it can), convert it to an ArrayList containing Cell objects representing sections of a grid (it does) and then render them using an GridView.</p>
  
  <p>The latest issue comes when I try to run the program on an emulator (from Eclipse). The program starts out fine, and it displays the MainMenu fine. When I click play game, it then gives me this error:</p>
  
  <pre><code>04-23 11:56:30.930: E/AndroidRuntime(948): FATAL EXCEPTION: main
  04-23 11:56:30.930: E/AndroidRuntime(948): Process: edu.mbhs.cs.margonon, PID: 948
  04-23 11:56:30.930: E/AndroidRuntime(948): java.lang.ClassCastException: android.view.ViewGroup$LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  04-23 11:56:30.930: E/AndroidRuntime(948):  at android.widget.RelativeLayout$DependencyGraph.findRoots(RelativeLayout.java:1722)
  04-23 11:56:30.930: E/AndroidRuntime(948):  at android.widget.RelativeLayout$DependencyGraph.getSortedViews(RelativeLayout.java:1667)
  04-23 11:56:30.930: E/AndroidRuntime(948):  at android.widget.RelativeLayout.sortChildren(RelativeLayout.java:373)
  04-23 11:56:30.930: E/AndroidRuntime(948):  at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:381)
  04-23 11:56:30.930: E/AndroidRuntime(948):  at android.view.View.measure(View.java:16458)
  04-23 11:56:30.930: E/AndroidRuntime(948):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
  04-23 11:56:30.930: E/AndroidRuntime(948):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
  04-23 11:56:30.930: E/AndroidRuntime(948):  at android.view.View.measure(View.java:16458)
  04-23 11:56:30.930: E/AndroidRuntime(948):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
  04-23 11:56:30.930: E/AndroidRuntime(948):  at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:327)
  04-23 11:56:30.930: E/AndroidRuntime(948):  at android.view.View.measure(View.java:16458)
  04-23 11:56:30.930: E/AndroidRuntime(948):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
  04-23 11:56:30.930: E/AndroidRuntime(948):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
  04-23 11:56:30.930: E/AndroidRuntime(948):  at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2289)
  04-23 11:56:30.930: E/AndroidRuntime(948):  at android.view.View.measure(View.java:16458)
  04-23 11:56:30.930: E/AndroidRuntime(948):  at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1914)
  04-23 11:56:30.930: E/AndroidRuntime(948):  at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1111)
  04-23 11:56:30.930: E/AndroidRuntime(948):  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1293)
  04-23 11:56:30.930: E/AndroidRuntime(948):  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:998)
  04-23 11:56:30.930: E/AndroidRuntime(948):  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5582)
  04-23 11:56:30.930: E/AndroidRuntime(948):  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
  04-23 11:56:30.930: E/AndroidRuntime(948):  at android.view.Choreographer.doCallbacks(Choreographer.java:562)
  04-23 11:56:30.930: E/AndroidRuntime(948):  at android.view.Choreographer.doFrame(Choreographer.java:532)
  04-23 11:56:30.930: E/AndroidRuntime(948):  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
  04-23 11:56:30.930: E/AndroidRuntime(948):  at android.os.Handler.handleCallback(Handler.java:733)
  04-23 11:56:30.930: E/AndroidRuntime(948):  at android.os.Handler.dispatchMessage(Handler.java:95)
  04-23 11:56:30.930: E/AndroidRuntime(948):  at android.os.Looper.loop(Looper.java:137)
  04-23 11:56:30.930: E/AndroidRuntime(948):  at android.app.ActivityThread.main(ActivityThread.java:4998)
  04-23 11:56:30.930: E/AndroidRuntime(948):  at java.lang.reflect.Method.invokeNative(Native Method)
  04-23 11:56:30.930: E/AndroidRuntime(948):  at java.lang.reflect.Method.invoke(Method.java:515)
  04-23 11:56:30.930: E/AndroidRuntime(948):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
  04-23 11:56:30.930: E/AndroidRuntime(948):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
  04-23 11:56:30.930: E/AndroidRuntime(948):  at dalvik.system.NativeStart.main(Native Method)
  </code></pre>
  
  <p>The error does not contain any references to my actual program however, so I'm not quite sure what the error is. I've included a couple files that I think <em>might</em> be the problem, but I can't tell for sure (I'm rather new to this). I included a link to my full repo at the bottom however, incase the error is somewhere else. Any help would be appreciated, thanks!</p>
  
  <h2>GameScreen.java:</h2>
  
  <pre><code>package edu.mbhs.cs.margonon;
  
  import java.io.BufferedReader;
  import java.io.File;
  import java.io.FileReader;
  import java.io.IOException;
  import java.io.InputStream;
  import java.io.InputStreamReader;
  import java.util.ArrayList;
  import java.util.List;
  
  import android.os.Bundle;
  import android.app.Activity;
  import android.content.Context;
  import android.util.Log;
  import android.view.Menu;
  import android.view.View;
  import android.view.ViewGroup.LayoutParams;
  import android.widget.AdapterView;
  import android.widget.AdapterView.OnItemClickListener;
  import android.widget.GridView;
  
  public class GameScreen extends Activity {
      private int[][] gridSolution;
      private int rows;
      private int cols;
      private List&lt;Integer&gt; solList = new ArrayList&lt;Integer&gt;();
      private List&lt;Cell&gt; cellList = new ArrayList&lt;Cell&gt;();
      private List&lt;Boolean&gt; solListBool = new ArrayList&lt;Boolean&gt;();
  
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_game_screen);
          createCellList();
          final GridView gameGrid = (GridView) findViewById(R.id.gameGridView);
          gameGrid.setLayoutParams(new LayoutParams(rows, cols));
          gameGrid.setAdapter(new gameGridAdapter(this, cellList, rows, cols));
          gameGrid.setOnItemClickListener(new OnItemClickListener() {
              @Override
              public void onItemClick(AdapterView&lt;?&gt; parent, View v, int position, long id){
                  cellList.get(position).cycleNext();
                  gameGrid.invalidate();
              }
          });
      }
  
      /**
       * This function takes the data from the raw resource grids.txt and puts it in a 2D array.
       * Currently it can only accept one grid.
       * TODO Make this function work for multiple puzzles (grids) in the file.
       * @return A 2D-array containing the solution for the grid.
       *
      public int[][] readGrids() {
          int[][] gs;
          InputStream is = getResources().openRawResource(R.raw.grids);
          try {
              BufferedReader br = new BufferedReader(new InputStreamReader(is));
              String line = br.readLine();
              String[] lineStrings;
              int[] lineInts;
  
              /* This do-while statement is a work around so that we can define the first two values without 
               * defining lineStrings and lineInts outside of a loop.
               *
               *
              do {
                  lineStrings = line.split("\\s");
                  lineInts = new int[lineStrings.length];
                  //TODO Make sure there are only two numbers.
                  for(int i = 0; i &lt; lineStrings.length; i++){
                      try{
                          lineInts[i] = Integer.parseInt(lineStrings[i]);
                      } catch(NumberFormatException e){
                          lineInts[i] = 1;
                      } // end try-catch
                  } // end for
                  cols = lineInts[0];
                  rows = lineInts[1];
              } while(false);
              gs = new int[rows][cols];
              *
  
              /* This section of code is intended to read each line and plop it into the array.
               *
              line = br.readLine();
              //TODO Add in default values if no grid is found. (And line is therefore null)
              lineStrings = line.split("\\s");
                  //lineInts = new int[lineStrings.length];
                  for(int i = 0; i &lt; lineStrings.length; i++) {
                      //TODO Handle what happens if the grid is bigger than what was originally specified.
                      try {
                          gs[on][i] = Integer.parseInt(lineStrings[i]);
                          Log.d("PARSING", (on + ", " + i + " = "  + gs[on][i]));
                          if(gs[on][i] == 0)
                              cellList.add(new Cell(on, i, false));
                          else
                              cellList.add(new Cell(on, i, true));
                      } catch(NumberFormatException e) {
                          //TODO Add something to respond to the exception.
                      } // end try-catch
                  } // end for
                  br.readLine();
                  on++;
              } // end while
  
          } catch (IOException e) {
              gs = new int[1][1];
              gs[0][0] = 1;
              e.printStackTrace();
          } // end try-catch
          return gs;
      } // end public int[][] readGrids
       */ 
      public void createCellList()
      {
          List&lt;Cell&gt; cl;
          InputStream is = getResources().openRawResource(R.raw.grids);
          BufferedReader br = new BufferedReader(new InputStreamReader(is));
          String[] lineStrings;
          int[] lineInts;
          String puzzleText = "";
  
          try {
              puzzleText = br.readLine();
              lineStrings = puzzleText.split("\\s");
              lineInts = new int[lineStrings.length - 2];
              System.out.println(puzzleText);
              System.out.println(lineStrings.length);
  
              for(int i = 0; i &lt; lineStrings.length; i++)
              {
                  if(i == 0) {
                      cols = Integer.parseInt(lineStrings[i]);
                      continue;
                  } else if(i == 1) {
                      rows = Integer.parseInt(lineStrings[i]);
                      continue;
                  } else {
                      lineInts[i-2] = Integer.parseInt(lineStrings[i]);
                      System.out.println(i + " " + lineInts[i-2]);
                      solList.add(lineInts[i-2]);
                      if(solList.get(i-2) == 1)
                          solListBool.add(true);
                      else
                          solListBool.add(false);
                  }
              }
  
              gridSolution = new int[rows][cols];
  
              for(int i = 0; i &lt; lineInts.length; i++)
              {
                  int y = i/cols;
                  int x = i - y * cols;
                  System.out.println("i=" + i + ", x=" + x + ", y=" + y);
                  gridSolution[y][x] = lineInts[i];
                  cellList.add(new Cell(x, y, solListBool.get(i)));
              }
          } catch (IOException e) {e.printStackTrace();}
  
      }
  }
  </code></pre>
  
  <h2>gameGridAdapter.java:</h2>
  
  <pre><code>package edu.mbhs.cs.margonon;
  
  import java.util.ArrayList;
  import java.util.List;
  
  import android.content.Context;
  import android.util.Log;
  import android.view.LayoutInflater;
  import android.view.View;
  import android.view.ViewGroup;
  import android.widget.BaseAdapter;
  import android.widget.ImageView;
  
  /**
   * This is the adapter that draws the grid.
   * 
   * @author Robert Rose
   */
  public class gameGridAdapter extends BaseAdapter {
      private LayoutInflater mInflater; // The inflater.
      private List&lt;Cell&gt; cells = new ArrayList&lt;Cell&gt;(); // A list containing all the cell objects.
      private int rows; // The number of rows.
      private int cols; // The number of columns.
  
      /**
       * This is the constructor which takes the context, a list of cell objects and
       * the grid dimensions to create an adapter which will render the grid.
       * 
       * @param context Context passed in from another class.
       * @param cellsIn 
       * @param r
       * @param c
       */
      public gameGridAdapter(Context context, List&lt;Cell&gt; cellsIn, int r, int c) {
          mInflater = LayoutInflater.from(context);
          for(int i = 0; i &lt; rows; i++)
              for(int k = 0; k &lt; cols; k++)
                  cells.add(cellsIn.get(i*(cols - 1) + k));
      }
  
      @Override
      public int getCount() {
          // TODO Auto-generated method stub
          return cells.size();
      }
  
      @Override
      public Object getItem(int position) {
          return cells.get(position);
      }
  
      @Override
      public long getItemId(int position) {
          return position;
      }
  
      @Override
      public View getView(int position, View convertView, ViewGroup parent) {
          View view;
          if(convertView == null) {
              view = mInflater.inflate(R.layout.button_grid_view, parent, false);
              ImageView imgView = (ImageView) view.findViewById(R.id.imageInGrid);
              imgView.setScaleType(ImageView.ScaleType.CENTER_CROP);
              imgView.setPadding(4, 4, 4, 4);
              switch(cells.get(position).getDisplay())
              {
                  case 0:
                      imgView.setImageResource(R.drawable.white);
                      break;
                  case 1:
                      imgView.setImageResource(R.drawable.colored);
                      break;
                  case 2:
                      imgView.setImageResource(R.drawable.cross);
                      break;
                  default:
                      Log.d("DRAWING", "display was set to invalid state");
              } // end switch;
  
          } else {
              view = convertView;
          } // end if
  
  
          return view;
      }
      //TODO http://ocddevelopers.com/2014/extend-baseadapter-instead-of-arrayadapter-for-custom-list-items/
      //TODO http://stackoverflow.com/questions/5046320/a-grid-layout-of-icon-text-buttons
  }
  </code></pre>
  
  <h2>Cell.java:</h2>
  
  <pre><code>package edu.mbhs.cs.margonon;
  
  import android.widget.ImageView;
  
  /**
   * This is the cell object for the nonogram program. Each cell has its on cell
   * object that holds what the current status of the cell is.
   * 
   * @author Robert Rose
   */
  public class Cell {
      private final boolean willBeFull; // Whether the cell will be full (true) or not (false)
      private int display = 0; // 0 = empty, 1 = filled, 2 = crossed out
      private boolean correctNow; // Whether the cell is currently in its correct state.
      private int rowIndex = -1; // The row on which this cell is located.
      private int columnIndex = -1; // The column on which this cell is located.
      private ImageView iv;
  
      /**
       * This is the primary constructor that takes a row index and a column index and
       * creates a cell with the value based on a boolean value.
       * 
       * @param ri        Row on which the cell lies.
       * @param ci        Column on which the cell lies.
       * @param willBe    Whether cell will be full or whether it is empty true = 
       *                  full, false = empty.
       */
      public Cell(int ri, int ci, boolean willBe) {
          rowIndex = ri;
          columnIndex = ci;
          willBeFull = willBe;
          display = 0;
          correctNow = isCorrect();
      } // end public Cell(int ri, int ci, boolean willBe)
  
      /**
       * This is an identical constructor to the one above, but can take an int instead
       * of a boolean value.
       * 
       * @param ri        Row on which the cell lies.
       * @param ci        Column on which the cell lies.
       * @param willBe    Whether cell will be full or whether it is empty. 1 = full 
       *                  (true), 0 = empty (false).
       *                  
       */
      public Cell(int ri, int ci, int willBe) {
          boolean b;
          if(willBe == 1)
              b = true;
          else
              b = false;
          rowIndex = ri;
          columnIndex = ci;
          willBeFull = b;
          display = 0;
          correctNow = isCorrect();
      }
  
      /**
       * Called to determine whether the current status of the cell is correct.
       * @return T/F. Whether the current status of the cell is correct.
       */
      public boolean isCorrect()
      {
          switch(display)
          {
              case 0:
                  if(willBeFull)
                      return false;
                  else
                      return true;
              case 1:
                  if(willBeFull) 
                      return true;
                  else 
                      return false;
              case 2:
                  if(willBeFull)
                      return false;
                  else
                      return true;
              default:
                  return false;
          } // end switch
      } // end public boolean isCorrect()
  
      public void cycleNext()
      {
          if(display == 2)
              display = 0;
          else
              display++;
      }
  
      /**
       * Getter function for the willBeFull variable.
       * @return T/F. Whether the cell should be filled or empty
       */
      public boolean getWillBeFull()
      {
          return willBeFull;
      } // end boolean getWillBeFull()
  
      /**
       * Getter function for the display variable.
       * @return 0 if cell is empty, 1 if cell is full, 2 if cell is crossed out
       */
      public int getDisplay()
      {
          return display;
      } // end public int getDisplay()
  
      /**
       * Getter function for the correctNow variable. Somewhat obsolete considering
       * the isCorrect() function exists, but I want it here, so I'm going to keep it here.
       * @return T/F. Whether the cell in its current state is correct.
       */
      public boolean getCorrectNow()
      {
          return correctNow;
      } // end public boolean getCorrectNow()
  
      /**
       * Getter function for the rowIndex, indicating which row the cell resides on the nonogram.
       * @return int. Index of row of the nonogram the cell resides on.
       */
      public int getRowIndex()
      {
          return rowIndex;
      } // end public int getRowIndex()
  
      /**
       * Getter for the columnIndex, indicating which column the cell resides on the nongram.
       * @return int. Index of coulmn of the nonogram the cell resides on.
       */
      public int getColumnIndex()
      {
          return columnIndex;
      } // end public int getColumnIndex()
  }
  </code></pre>
  
  <h2>activity_game_screen.xml:</h2>
  
  <pre><code>&lt;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=".GameScreen" &gt;
  
      &lt;GridView
          android:id="@+id/gameGridView"
          android:layout_width="324dp"
          android:layout_height="324dp"
          android:layout_alignParentTop="true"
          android:layout_centerHorizontal="true"
          android:columnWidth="48dp"
          android:gravity="center"
          android:horizontalSpacing="10dp"
          android:numColumns="6"
          android:padding="3dp"
          android:stretchMode="columnWidth"
          android:verticalSpacing="0dp" &gt;
      &lt;/GridView&gt;
  
  &lt;/RelativeLayout&gt;
  </code></pre>
  
  <h2>button_grid_view.xml:</h2>
  
  <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
  &lt;FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:id="@+id/gridButton"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:orientation="vertical"
      android:gravity="center_horizontal"&gt;
      &lt;ImageView
          android:id="@+id/imageInGrid"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"
          android:adjustViewBounds="false"&gt;
      &lt;/ImageView&gt;
  
  &lt;/FrameLayout&gt;
  </code></pre>
  
  <h2>Full Repo: <a href="https://github.com/RobRoseKnows/nonogram" rel="nofollow">https://github.com/RobRoseKnows/nonogram</a></h2>