Faisal Naseer
Faisal Naseer

Reputation: 4248

SimpleCursorAdapter unable to populate TextView

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>

LogCat

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

Answers (2)

simekadam
simekadam

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

Anti Veeranna
Anti Veeranna

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

Related Questions