1

I am getting an IndexOutOfBoundsException, that I need some help with.

Here is the error in my stack trace

FATAL EXCEPTION: main
Process: com.guhring.vending, PID: 2210
java.lang.IndexOutOfBoundsException: Invalid index 4, size is 4
    at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
    at java.util.ArrayList.get(ArrayList.java:308)
    at com.guhring.vending.adapters.ReportAdapter.getView(ReportAdapter.java:112)
    at android.widget.AbsListView.obtainView(AbsListView.java:2346)
    at android.widget.ListView.measureHeightOfChildren(ListView.java:1280)
    at android.widget.ListView.onMeasure(ListView.java:1188)
    at android.view.View.measure(View.java:18788)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:748)
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:630)
    at android.view.View.measure(View.java:18788)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)

I know why the exception is happening, it is because in my JSON File, the machinereports Array has a different amount of items, if you look below, the first item has 4 items and the second item has 6,

{
"id" : 1,       
"reports": [
    {
        "id": "1",
        "title": "For Reorder",
        "subtitle": "Report Name",
        "date": "Monday, Aug 08, 2016",
        "machinereports": [
            {
                "name": "Reorder List",
                "count": "9"
            },
            {
                "name": "Reorder List Critical",
                "count": "9"
            }

        ]
    },
    {
        "id": "2",
        "title": "For Stock",
        "subtitle": "Report Name",
        "date": "Monday, Aug 08, 2016",
        "machinereports": [
            {
                "name": "Article List",
                "count": "531"
            },
            {
                "name": "Articles Out For More Than 7 Days",
                "count": "1"
            },
            {
                "name": "Stock Report",
                "count": "559"
            }
        ]
    }
  ]
}

Here is my main class Activity and Report Class

public class MachineReportsActivity extends AppCompatActivity {

private ReportAdapter adapter;
private ListView mListView;
private ArrayList<Report> reportList;

private String id;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
    setContentView(R.layout.machinereports);

    Intent i = getIntent();
    id = i.getStringExtra("id");

    mListView = (ListView) findViewById(R.id.machine_report_list_view);
    reportList = Report.getReportsFromFile("reports.json", this);
    adapter = new ReportAdapter(this, reportList);
    if (mListView != null) {
        mListView.setAdapter(adapter);

    }
  }
}

public class Report {
public String id;
public String title;
public String subtitle;
public String date;
public ArrayList<String> machinereports = new ArrayList<>();

public static ArrayList<Report> getReportsFromFile(String filename, Context context) {
    final ArrayList<Report> reportList = new ArrayList<>();

    try {
        // Load Data
        String jsonStr = loadJsonFromAsset("reports.json", context);
        JSONObject jsonOne = new JSONObject(jsonStr);
        JSONArray reports = jsonOne.getJSONArray("reports");


        // Get Report objects from data
        for(int i = 0; i < reports.length(); i++) {
            Report report = new Report();

            report.id = reports.getJSONObject(i).getString("id");
            report.title = reports.getJSONObject(i).getString("title");
            report.subtitle = reports.getJSONObject(i).getString("subtitle");
            report.date = reports.getJSONObject(i).getString("date");

            // Get inner array listOrReports
            /* JSONArray rList = jsonOne.getJSONArray("machinereports");*/
            JSONArray rList = reports.getJSONObject(i).getJSONArray("machinereports");

            for(int j = 0; j < rList.length(); j++) {
                JSONObject jsonTwo = rList.getJSONObject(j);
                report.machinereports.add(jsonTwo.getString("name"));
                report.machinereports.add(jsonTwo.getString("count"));
            }
            reportList.add(report);

        }

    } catch (JSONException e) {
        e.printStackTrace();
    }

    return reportList;
}

private static String loadJsonFromAsset(String filename, Context context) {
    String json = null;

    try {
        InputStream is = context.getAssets().open(filename);
        int size = is.available();
        byte[] buffer = new byte[size];
        is.read(buffer);
        is.close();
        json = new String(buffer, "UTF-8");
    }
    catch (java.io.IOException ex) {
        ex.printStackTrace();
        return null;
    }

    return json;
  }

}

My custom Adapter is set up like this

public class ReportAdapter extends BaseAdapter {
private Context mContext;
private LayoutInflater mInflater;
private ArrayList<Report> mDataSource;
private ArrayList<Report> arrayList;

public ReportAdapter(Context context, ArrayList<Report> items) {
    mContext = context;
    mDataSource = items;
    mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    arrayList = new ArrayList<Report>();
    arrayList.addAll(mDataSource);
}

// Implement a ViewHolder Class which stores each of the row's subviews,
// and in turn is stored inside the tag field of the layout
private static class ViewHolder {
    public TextView  titleTextView;
    public TextView  subTitleTextView;
    public TextView  dateTextView;
    public TextView  reportOneTextView;
    public TextView  reportTwoTextView;
    public TextView  reportThreeTextView;
    public TextView  reportFourTextView;
    public TextView  reportFiveTextView;
    public TextView  reportSixTextView;

}

@Override
public int getCount() {
    return mDataSource.size();
}

@Override
public Object getItem(int position) {
    return mDataSource.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;

    if(convertView == null) {
        convertView = mInflater.inflate(R.layout.list_item_machine_reports, parent, false);

        holder = new ViewHolder();
        holder.titleTextView       = (TextView) convertView.findViewById(R.id.reports_list_title);
        holder.subTitleTextView    = (TextView) convertView.findViewById(R.id.reports_list_subtitle);
        holder.dateTextView        = (TextView) convertView.findViewById(R.id.reports_list_date);
        holder.reportOneTextView   = (TextView) convertView.findViewById(R.id.reports_list_reportName);
        holder.reportTwoTextView   = (TextView) convertView.findViewById(R.id.reports_list_reportCount);
        holder.reportThreeTextView = (TextView) convertView.findViewById(R.id.reports_list_reportName02);
        holder.reportFourTextView  = (TextView) convertView.findViewById(R.id.reports_list_reportCount02);
        holder.reportFiveTextView  = (TextView) convertView.findViewById(R.id.reports_list_reportName03);
        holder.reportSixTextView   = (TextView) convertView.findViewById(R.id.reports_list_reportCount03);

        convertView.setTag(holder);
    }else{
        holder = (ViewHolder) convertView.getTag();
    }

    TextView titleTextView       = holder.titleTextView;
    TextView subTitleTextView    = holder.subTitleTextView;
    TextView dateTextView        = holder.dateTextView;
    TextView reportOneTextView   = holder.reportOneTextView;
    TextView reportTwoTextView   = holder.reportTwoTextView;
    TextView reportThreeTextView = holder.reportThreeTextView;
    TextView reportFourTextView  = holder.reportFourTextView;
    TextView reportFiveTextView  = holder.reportFiveTextView;
    TextView reportSixTextView   = holder.reportSixTextView;


    Report report = (Report) getItem(position);

    titleTextView.setText(report.title);
    subTitleTextView.setText(report.subtitle);
    dateTextView.setText(report.date);

    reportOneTextView.setText(report.machinereports.get(0));
    reportTwoTextView.setText(report.machinereports.get(1));
    reportThreeTextView.setText(report.machinereports.get(2));
    reportFourTextView.setText(report.machinereports.get(3));
    reportFiveTextView.setText(report.machinereports.get(4));
    reportSixTextView.setText(report.machinereports.get(5));

    return convertView;
 }
}

And this is my list item view, In the view I want to populate two of the texviews based on the number of machinereport items returned from the json object, but as you can see, the way I have it set up, it is not allowing me to. I have to write n number of instances of the RelativeLayout and supply the data, but the machinereport data count is variable.

<RelativeLayout
        android:id="@+id/RelativeLayout03"
        android:layout_width="300dp"
        android:layout_height="30dp"
        android:background="#ffffff"
        android:orientation="horizontal"
        android:layout_marginTop="22dp"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginLeft="20dp"
        android:layout_marginStart="20dp">

        <TextView
            android:id="@+id/reports_list_reportName"
            android:layout_width="230dp"
            android:layout_height="wrap_content"
            android:textSize="12sp"
            tools:text="ReportName"
            android:textStyle="bold"
            android:paddingLeft="15dp"
            android:textColor="#000000"
            android:layout_centerVertical="true"
            android:layout_toRightOf="@+id/imageView"
            android:layout_toEndOf="@+id/imageView" />

        <TextView
            android:id="@+id/reports_list_reportCount"
            android:layout_width="25dp"
            android:layout_height="wrap_content"
            android:textSize="15sp"
            tools:text=""
            android:textStyle="bold"
            android:textColor="#000000"
            android:layout_marginRight="10dp"
            android:layout_marginEnd="10dp"
            android:layout_alignTop="@+id/reports_list_reportName"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true" />

        <ImageView
            android:layout_width="20dp"
            android:layout_height="wrap_content"
            android:id="@+id/imageView"
            android:layout_alignTop="@+id/reports_list_reportName"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_marginLeft="8dp"
            android:layout_marginStart="8dp"
            android:layout_alignBottom="@+id/reports_list_reportName"
            android:src="@drawable/file" />

    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/RelativeLayout04"
        android:layout_width="300dp"
        android:layout_height="30dp"
        android:background="#ffffff"
        android:orientation="horizontal"
        android:layout_marginTop="20dp"
        android:layout_below="@+id/RelativeLayout03"
        android:layout_alignLeft="@+id/RelativeLayout03"
        android:layout_alignStart="@+id/RelativeLayout03">

        <TextView
            android:id="@+id/reports_list_reportName02"
            android:layout_width="230dp"
            android:layout_height="wrap_content"
            android:textSize="12sp"
            tools:text="ReportName"
            android:textStyle="bold|normal"
            android:paddingLeft="15dp"
            android:textColor="#000000"
            android:layout_centerVertical="true"
            android:layout_toRightOf="@+id/imageView2" />

        <TextView
            android:id="@+id/reports_list_reportCount02"
            android:layout_width="25dp"
            android:layout_height="wrap_content"
            android:textSize="15sp"
            tools:text=""
            android:textStyle="bold"
            android:textColor="#000000"
            android:layout_marginRight="10dp"
            android:layout_marginEnd="10dp"
            android:layout_alignTop="@+id/reports_list_reportName02"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true" />

        <ImageView
            android:layout_width="20dp"
            android:layout_height="wrap_content"
            android:id="@+id/imageView2"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_marginLeft="8dp"
            android:layout_marginStart="8dp"
            android:src="@drawable/file"
            android:layout_alignTop="@+id/reports_list_reportName02"
            android:layout_alignBottom="@+id/reports_list_reportName02" />

    </RelativeLayout>


    <RelativeLayout
        android:id="@+id/RelativeLayout05"
        android:layout_width="300dp"
        android:layout_height="30dp"
        android:background="#ffffff"
        android:orientation="horizontal"
        android:layout_marginTop="20dp"
        android:layout_below="@+id/RelativeLayout04"
        android:layout_alignLeft="@+id/RelativeLayout04"
        android:layout_alignStart="@+id/RelativeLayout04">

        <TextView
            android:id="@+id/reports_list_reportName03"
            android:layout_width="230dp"
            android:layout_height="wrap_content"
            android:textSize="12sp"
            tools:text="ReportName"
            android:textStyle="bold|normal"
            android:paddingLeft="15dp"
            android:textColor="#000000"
            android:layout_centerVertical="true"
            android:layout_toRightOf="@+id/imageView6"
            android:layout_toEndOf="@+id/imageView6" />

        <TextView
            android:id="@+id/reports_list_reportCount03"
            android:layout_width="25dp"
            android:layout_height="wrap_content"
            android:textSize="15sp"
            tools:text=""
            android:textStyle="bold"
            android:textColor="#000000"
            android:layout_alignTop="@+id/reports_list_reportName03"
            android:layout_toRightOf="@+id/reports_list_reportName03"
            android:layout_toEndOf="@+id/reports_list_reportName03"
            android:layout_marginLeft="7dp"
            android:layout_marginStart="7dp" />

        <ImageView
            android:layout_width="20dp"
            android:layout_height="wrap_content"
            android:id="@+id/imageView6"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_marginLeft="8dp"
            android:layout_marginStart="8dp"
            android:src="@drawable/file"
            android:layout_alignTop="@+id/reports_list_reportName03"
            android:layout_alignBottom="@+id/reports_list_reportName03" />

    </RelativeLayout>
Psy Chotic
  • 219
  • 1
  • 3
  • 11

0 Answers0