Reputation: 4248
I am working on an application with a portion names code for call logs which populates takes two arrays and populate SimpleCursorAdapter the application crashes. when I debug the application and check the arrays are populated but stops where SimpleCursorAdapter is created.
code:
View rootView = inflater.inflate(all_frag, container, false);
lv=(ListView) rootView.findViewById(R.id.list1);
//code for month dropdown list
ArrayList<String> month = new ArrayList<String>();
int thismonth = Calendar.getInstance().get(Calendar.MONTH)+1;
for (int i =thismonth; i >= thismonth-2; i--) {
SimpleDateFormat month_date = new SimpleDateFormat("MMM");
month.add(Integer.toString(i));
//String name=Integer.toString(i);
month.add(month_date.format(i));
}
ArrayAdapter<String> adapter = new ArrayAdapter<String>(rootView.getContext(), android.R.layout.simple_spinner_item,month);
Spinner spinmonth =(Spinner) rootView.findViewById(R.id.month);
spinmonth.setAdapter(adapter);
//code for call logs
Cursor managedCursor = getActivity().getContentResolver().query(CallLog.Calls.CONTENT_URI, null, null, null, null);
if(managedCursor.moveToFirst()) {
int type = managedCursor.getColumnIndex(CallLog.Calls.TYPE);
int date = managedCursor.getColumnIndex(CallLog.Calls.DATE);
String callType = managedCursor.getString(type);
String callDate = managedCursor.getString(date);
Date callDayTime = new Date(Long.valueOf(callDate));
String dir = null;
int dircode = Integer.parseInt(callType);
switch (dircode) {
case CallLog.Calls.OUTGOING_TYPE:
dir = "OUTGOING";
break;
case CallLog.Calls.INCOMING_TYPE:
dir = "INCOMING";
break;
case CallLog.Calls.MISSED_TYPE:
dir = "MISSED";
break;
}
String[] fromColumns = {CallLog.Calls.CACHED_NAME, CallLog.Calls.NUMBER, CallLog.Calls.DURATION,dir,callDayTime.toString()};
int[] toviews = {R.id.name, R.id.number, R.id.duration,R.id.type,R.id.caltime};
SimpleCursorAdapter adapter1 = new SimpleCursorAdapter(rootView.getContext(), R.layout.all_list, managedCursor, fromColumns, toviews, 0);
lv.setAdapter(adapter1);
}
return rootView;
}
all_list.XML:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Text"
android:id="@+id/number"
android:textColor="#ffffffff"
android:layout_above="@+id/type"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Text"
android:id="@+id/duration"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:textColor="#ffffffff" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Text"
android:id="@+id/caltime"
android:layout_below="@+id/duration"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:textColor="#ffffffff" />
<View
android:layout_width="fill_parent"
android:layout_height="1dp"
android:background="@android:color/darker_gray"
android:id="@+id/view"
android:layout_below="@+id/type"
android:layout_alignRight="@+id/caltime"
android:layout_alignEnd="@+id/caltime" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Text"
android:id="@+id/type"
android:layout_below="@+id/caltime"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:textColor="#ffffffff" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Text"
android:id="@+id/name"
android:layout_above="@+id/number"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:textColor="#ffffffff" />
</RelativeLayout>
05-14 15:32:37.894 32683-32683/com.nm.uzage E/dalvikvm? >>>>> Normal User
05-14 15:32:37.894 32683-32683/com.nm.uzage E/dalvikvm? >>>>> com.nm.uzage [ userId:0 | appId:10326 ]
05-14 15:32:40.096 32683-32683/com.nm.uzage E/AndroidRuntime? FATAL EXCEPTION: main
Process: com.nm.uzage, PID: 32683
java.lang.ArrayIndexOutOfBoundsException: length=3; index=3
at android.widget.SimpleCursorAdapter.bindView(SimpleCursorAdapter.java:150)
at android.widget.CursorAdapter.getView(CursorAdapter.java:254)
at android.widget.AbsListView.obtainView(AbsListView.java:2780)
at android.widget.ListView.measureHeightOfChildren(ListView.java:1274)
at android.widget.ListView.onMeasure(ListView.java:1186)
at android.view.View.measure(View.java:17594)
at android.widget.RelativeLayout.measureChild(RelativeLayout.java:689)
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:473)
at android.view.View.measure(View.java:17594)
at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1456)
at android.view.View.measure(View.java:17594)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5398)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1410)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
at android.view.View.measure(View.java:17594)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5398)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at android.view.View.measure(View.java:17594)
at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:719)
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:455)
at android.view.View.measure(View.java:17594)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5398)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at android.view.View.measure(View.java:17594)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5398)
at android.support.v7.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:453)
at android.view.View.measure(View.java:17594)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5398)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at android.view.View.measure(View.java:17594)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5398)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1410)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
at android.view.View.measure(View.java:17594)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5398)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2588)
at android.view.View.measure(View.java:17594)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2308)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1409)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1610)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1267)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6638)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:813)
at android.view.Choreographer.doCallbacks(Choreographer.java:613)
at android.view.Choreographer.doFrame(Choreographer.java:583)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:799)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:146)
at android.app.ActivityThread.main(ActivityThread.java:5635)
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:1291)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)
at dalvik.system.NativeStart.main(Native Method)
05-14 15:33:21.647 2721-2721/com.nm.uzage E/dalvikvm? >>>>> Normal User
05-14 15:33:21.647 2721-2721/com.nm.uzage E/dalvikvm? >>>>> com.nm.uzage [ userId:0 | appId:10326 ]
05-14 15:45:07.806 8615-8615/com.nm.uzage E/dalvikvm? >>>>> Normal User
05-14 15:45:07.806 8615-8615/com.nm.uzage E/dalvikvm? >>>>> com.nm.uzage [ userId:0 | appId:10326 ]
Upvotes: 1
Views: 204
Reputation: 7384
Your Cursor
does not have enough columns..That seems to be the issue. Puth there a breakpoint a look through your managedCursor
instance.
If you look at the sourcecode where the crash occurs you see:
String text = cursor.getString(from[i]);
That means your cursor probably does not have enough columns.
EDIT:
The root is somehwhere else I guess. As Anti correctly pointed out your are using incorrect column names. The array of columns gets however filtered in the SimpleCursorAdapter
constructor and only valid column names are taken in.
So it's not that your Cursor does not have enough columns, it fails because your from
(columns) and to
(views) counts are not equal.
Upvotes: 2
Reputation: 11613
According to your logcat your code crashes in SimpleCursorAdapter bindView method() with java.lang.ArrayIndexOutOfBoundsException: length=3; index=3
If you look at the source code of that method, then it will first take the amount of elements in the "to" parameter - this correspondends to your int[] toviews variable - which has 5 elements
Then it loops over the cursor and tries to get 5 elements by index out of it - this however fails at element 3 causing the crash - because apparently the cursor only has 3 columns.
fromColumns is supposed to contain column names, and you are trying to pass in strings that are not column names (dir and callDayTime)
One way to solve this is to subclass SimpleCursorAdapter and override the bindView method - you can take the linked source as base and modify it to work the way you need to.
Another solution would be to create your own adapter.
Upvotes: 1