{"id":1728,"date":"2022-08-30T15:18:57","date_gmt":"2022-08-30T15:18:57","guid":{"rendered":"https:\/\/unknownerror.org\/index.php\/2013\/11\/29\/how-to-use-the-loadercursor-with-my-own-adapter-collection-of-common-programming-errors\/"},"modified":"2022-08-30T15:18:57","modified_gmt":"2022-08-30T15:18:57","slug":"how-to-use-the-loadercursor-with-my-own-adapter-collection-of-common-programming-errors","status":"publish","type":"post","link":"https:\/\/unknownerror.org\/index.php\/2022\/08\/30\/how-to-use-the-loadercursor-with-my-own-adapter-collection-of-common-programming-errors\/","title":{"rendered":"how to use the loader&lt;cursor&gt; with my own adapter?-Collection of common programming errors"},"content":{"rendered":"<p>I&#8217;m getting some errors when trying to implement loader manager for use with my content provider and DB.<\/p>\n<p><strong>I&#8217;ll start with logcat output:<\/strong><\/p>\n<pre><code>1-19 16:37:33.628: I\/(20193): Loaded EGL implementation \/system\/lib\/\/egl\/libEGL_tegra_impl\n01-19 16:37:33.648: I\/(20193): Loading GLESv2 implementation \/system\/lib\/\/egl\/libGLESv2_tegra_impl\n01-19 16:37:33.883: E\/CursorWindow(20193): Failed to read row 0, column -1 from a CursorWindow which has 11 rows, 1 columns.\n01-19 16:37:33.883: W\/dalvikvm(20193): threadid=1: thread exiting with uncaught exception (group=0x40cfc2d0)\n01-19 16:37:33.893: E\/AndroidRuntime(20193): FATAL EXCEPTION: main\n01-19 16:37:33.893: E\/AndroidRuntime(20193): java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.database.CursorWindow.nativeGetString(Native Method)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.database.CursorWindow.getString(CursorWindow.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at adapters.FastScrollAdapter.getView(FastScrollAdapter.java:99)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.widget.AbsListView.obtainView(AbsListView.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.widget.ListView.makeAndAddView(ListView.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.widget.ListView.fillDown(ListView.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.widget.ListView.fillFromTop(ListView.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.widget.ListView.layoutChildren(ListView.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.widget.AbsListView.onLayout(AbsListView.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.view.View.layout(View.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.view.ViewGroup.layout(ViewGroup.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.widget.LinearLayout.setChildFrame(LinearLayout.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.widget.LinearLayout.layoutVertical(LinearLayout.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.widget.LinearLayout.onLayout(LinearLayout.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.view.View.layout(View.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.view.ViewGroup.layout(ViewGroup.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.widget.LinearLayout.setChildFrame(LinearLayout.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.widget.LinearLayout.layoutVertical(LinearLayout.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.widget.LinearLayout.onLayout(LinearLayout.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.view.View.layout(View.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.view.ViewGroup.layout(ViewGroup.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.widget.FrameLayout.onLayout(FrameLayout.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.view.View.layout(View.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.view.ViewGroup.layout(ViewGroup.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.support.v4.view.ViewPager.onLayout(ViewPager.java:1520)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.view.View.layout(View.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.view.ViewGroup.layout(ViewGroup.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.widget.LinearLayout.setChildFrame(LinearLayout.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.widget.LinearLayout.layoutVertical(LinearLayout.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.widget.LinearLayout.onLayout(LinearLayout.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.view.View.layout(View.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.view.ViewGroup.layout(ViewGroup.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.widget.FrameLayout.onLayout(FrameLayout.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.view.View.layout(View.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.view.ViewGroup.layout(ViewGroup.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.widget.LinearLayout.setChildFrame(LinearLayout.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.widget.LinearLayout.layoutVertical(LinearLayout.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.widget.LinearLayout.onLayout(LinearLayout.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.view.View.layout(View.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.view.ViewGroup.layout(ViewGroup.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.widget.FrameLayout.onLayout(FrameLayout.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.view.View.layout(View.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.view.ViewGroup.layout(ViewGroup.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.view.ViewRootImpl.performLayout(ViewRootImpl.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.view.Choreographer$CallbackRecord.run(Choreographer.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.view.Choreographer.doCallbacks(Choreographer.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.view.Choreographer.doFrame(Choreographer.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.os.Handler.handleCallback(Handler.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.os.Handler.dispatchMessage(Handler.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.os.Looper.loop(Looper.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at android.app.ActivityThread.main(ActivityThread.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at java.lang.reflect.Method.invokeNative(Native Method)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at java.lang.reflect.Method.invoke(Method.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java)\n01-19 16:37:33.893: E\/AndroidRuntime(20193):    at dalvik.system.NativeStart.main(Native Method)\n<\/code><\/pre>\n<p>Here is the fragment where the list should be displayed:<\/p>\n<pre><code>public class ShiftsFragment extends Fragment implements\n            LoaderManager.LoaderCallbacks {\n\n        public static Typeface tf, tf2, roboto;\n        private FastScrollAdapter adapter;\n        ListView ls;\n\n        public static ShiftsFragment newInstance(String title) {\n\n            ShiftsFragment pageFragment = new ShiftsFragment();\n            return pageFragment;\n        }\n\n        @SuppressLint(\"NewApi\")\n        @Override\n        public View onCreateView(LayoutInflater inflater, ViewGroup container,\n                Bundle savedInstanceState) {\n            View view = inflater.inflate(R.layout.shifts, container, false);\n\n            \/*\n             * StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()\n             * .detectAll().penaltyLog().build()); StrictMode.setVmPolicy(new\n             * StrictMode.VmPolicy.Builder()\n             * .detectLeakedSqlLiteObjects().detectLeakedClosableObjects()\n             * .penaltyLog().penaltyDeath().build());\n             *\/\n\n            roboto = Typeface.createFromAsset(getActivity().getAssets(),\n                    \"fonts\/JuraLight.ttf\");\n            tf = Typeface.createFromAsset(getActivity().getAssets(),\n                    \"fonts\/Advert.ttf\");\n            tf2 = Typeface.createFromAsset(getActivity().getAssets(),\n                    \"fonts\/passion.ttf\");\n\n            TextView SF = (TextView) view.findViewById(R.id.total);\n            SF.setTypeface(tf);\n\n            ls = (ListView)view.findViewById(android.R.id.list);\n\n\n            getLoaderManager().initLoader(0, null, this);\n\n\n            return view;\n\n        }\n\n        public Loader onCreateLoader(int loaderId, Bundle args) {\n            \/\/ Query the db asyncronously\n\n            String[] projection = { DBAdapter.KEY_ROWID,\n                    DBAdapter.KEY_TIMESTAMP_IN, DBAdapter.KEY_TIMESTAMP_OUT };\n            String where = null;\n            String[] whereArgs = null;\n            String sortOrder = null;\n\n            CursorLoader cursorLoader = new CursorLoader(getActivity(),\n                    provider.CONTENT_URI, projection, null, null, null);\n\n            return cursorLoader;\n        }\n\n        @SuppressLint(\"NewApi\")\n        @Override\n        public void onLoadFinished(Loader arg0, Cursor arg1) {\n\n            \/\/ Update adapter and views \/\/ must use a handler to sync UI thread\n            \/\/ stuff\n            adapter = new FastScrollAdapter(getActivity(), arg1);\n            ls.setAdapter(adapter);\n        }\n\n        @Override\n        public void onLoaderReset(Loader arg0) {\n            \/\/ release references\n\n        }\n\n    }\n<\/code><\/pre>\n<p><strong>This is my content provider class:<\/strong><\/p>\n<pre><code>public class provider extends ContentProvider {\n\n    private DBAdapter dbAdapter;\n    private static final String AUTHORITY = \"provider\";\n\n    private static final String BASE_PATH = \"todos\";\n    public static final Uri CONTENT_URI = Uri.parse(\"content:\/\/\" + AUTHORITY\n            + \"\/\" + BASE_PATH);\n\n    @Override\n    public int delete(Uri uri, String selection, String[] selectionArgs) {\n        \/\/ TODO Auto-generated method stub\n        return 0;\n    }\n\n    @Override\n    public String getType(Uri uri) {\n        \/\/ TODO Auto-generated method stub\n        return null;\n    }\n\n    @Override\n    public Uri insert(Uri uri, ContentValues values) {\n        \/\/ TODO Auto-generated method stub\n        return null;\n    }\n\n    @Override\n    public boolean onCreate() {\n        dbAdapter = new DBAdapter(getContext());\n        return false;\n    }\n\n    @Override\n    public Cursor query(Uri uri, String[] projection, String selection,\n            String[] selectionArgs, String sortOrder) {\n        SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();\n        DBAdapter dba = new DBAdapter(getContext());\n        dba.open();\n        SQLiteDatabase db = DBAdapter.db;\n        queryBuilder.setTables(DBAdapter.DATABASE_TABLE);\n\n        Cursor cursor = queryBuilder.query(db, projection, selection,\n                selectionArgs, null, null, sortOrder);\n        cursor.setNotificationUri(getContext().getContentResolver(), uri);\n\n        \/\/ TODO Auto-generated method stub\n        return cursor;\n    }\n\n    @Override\n    public int update(Uri uri, ContentValues values, String selection,\n            String[] selectionArgs) {\n        \/\/ TODO Auto-generated method stub\n        return 0;\n    }\n\n}\n<\/code><\/pre>\n<p><strong>and here is my own custom adapter:<\/strong><\/p>\n<pre><code>\/\/ This is a custom adapter that will use cursor to get data from SQLite DB as the source.\n\npublic class FastScrollAdapter extends CursorAdapter {\n\n    private LayoutInflater mInflater;\n    public static Cursor cursor;\n    public static int c = 0;\n    public static ViewHolder holder;\n    public DBAdapter dba;\n    Context context;\n\n\n    public FastScrollAdapter(Context context, Cursor c) {\n        super(context, c);\n        this.mInflater = LayoutInflater.from(context);\n        this.cursor = c;\n        this.context = context;\n\n    }\n\n    public FastScrollAdapter(Context context, Cursor c, boolean autoRequery) {\n        super(context, c, autoRequery);\n        this.mInflater = LayoutInflater.from(context);\n        this.cursor = c;\n    }\n\n    \/\/ Here we shall look to see if the View already exists and create a new one\n    \/\/ if not.\n\n    @Override\n    public View getView(int position, View convertView, ViewGroup parent) {\n\n        dba = new DBAdapter(context);\n        this.cursor = dba.getAllShifts();\n\n        int listLength = cursor.getCount();\n        \/\/ If view doesn't exists = create a new one and also store it (all of\n        \/\/ the views) in our ViewHolder class called \"holder\"\n        if (convertView == null) {\n\n            convertView = this.mInflater.inflate(R.layout.list_entry2, null);\n            holder = new ViewHolder();\n            holder.TL = (TableLayout) convertView.findViewById(R.id.TableBG);\n            holder.info = (TextView) convertView.findViewById(R.id.Info);\n            holder.info.setTypeface(SettingsFragment.roboto);\n            holder.info.setText(\"Info\");\n            holder.dateDisp = (TextView) convertView\n                    .findViewById(R.id.dateDisp);\n            holder.timeInShift = (TextView) convertView\n                    .findViewById(R.id.timeInShift);\n            holder.day = (TextView) convertView.findViewById(R.id.day);\n            holder.Money = (TextView) convertView.findViewById(R.id.Money);\n            holder.shiftDisp = (TextView) convertView\n                    .findViewById(R.id.shiftDisp);\n            holder.start_finish = (TextView) convertView\n                    .findViewById(R.id.start_finish);\n            holder.Duration = (TextView) convertView\n                    .findViewById(R.id.Duration);\n\n            holder.insert = (TextView) convertView.findViewById(R.id.insert);\n            holder.insert.setTypeface(ShiftsFragment.roboto);\n\n            convertView.setTag(holder);\n\n            \/\/ If exists, just fetch this view and display it.\n        } else {\n            holder = (ViewHolder) convertView.getTag();\n\n        }\n        this.cursor.moveToPosition(position);\n\n        \/\/ Set some values...\n        \/*************** Taken From DB ******************\/\n        holder.start_finish.setText(this.cursor.getString(this.cursor\n                .getColumnIndex(DBAdapter.KEY_START_TEXT_VIEW))\n                + this.cursor.getString(this.cursor\n                        .getColumnIndex(DBAdapter.KEY_END_TEXT_VIEW)));\n        holder.start_finish.setTypeface(ShiftsFragment.roboto);\n\n        holder.shiftDisp.setText(this.cursor.getString(this.cursor\n                .getColumnIndex(DBAdapter.KEY_MONEY)));\n        holder.shiftDisp.setTypeface(ShiftsFragment.roboto);\n        \/\/\n\n        holder.dateDisp.setText(this.cursor.getString(this.cursor\n                .getColumnIndex(DBAdapter.KEY_DATE)));\n        holder.dateDisp.setTypeface(ShiftsFragment.roboto);\n\n        holder.day.setText(this.cursor.getString(this.cursor\n                .getColumnIndex(DBAdapter.KEY_DAY)));\n        holder.day.setTypeface(ShiftsFragment.roboto);\n\n        holder.timeInShift.setText(this.cursor.getString(this.cursor\n                .getColumnIndex(DBAdapter.KEY_TOTAL_TIME_OF_SHIFT_STRING)));\n        holder.timeInShift.setTypeface(ShiftsFragment.roboto);\n\n        holder.insert.setText(this.cursor.getString(this.cursor\n                .getColumnIndex(DBAdapter.KEY_INSERT_MODE)));\n\n        \/\/\n\n        \/*************** Regular ones ******************\/\n\n        holder.info.setTypeface(ShiftsFragment.roboto);\n        holder.info.setText(\"Date:\");\n\n        holder.Money.setTypeface(ShiftsFragment.roboto);\n        holder.Money.setText(\"Money Made:\");\n\n        holder.Duration.setTypeface(ShiftsFragment.roboto);\n        holder.Duration.setText(\"Duration:\");\n\n        return convertView;\n    }\n\n    @Override\n    public void bindView(View view, Context context, Cursor cursor) {\n    }\n\n    @Override\n    public View newView(Context context, Cursor cursor, ViewGroup parent) {\n\n        return null;\n    }\n\n    static class ViewHolder {\n        TextView info;\n        TextView dateDisp;\n        TextView day;\n        TextView Duration;\n        TextView start_finish;\n        TextView Money;\n        TextView shiftDisp;\n        TextView timeInShift;\n        TextView insert;\n        TableLayout TL;\n\n    }\n\n    public static void animate(final View v) {\n\n        final Animation out = new AlphaAnimation(1, 0);\n        out.setInterpolator(new DecelerateInterpolator());\n        out.setDuration(350);\n        v.setAnimation(out);\n        out.start();\n        out.setAnimationListener(new AnimationListener() {\n\n            @Override\n            public void onAnimationStart(Animation animation) {\n                Log.i(\"Animation\", \"Started\");\n\n            }\n\n            @Override\n            public void onAnimationRepeat(Animation animation) {\n\n                \/\/ Shifts.setSummaryCursor.requery();\n\n\n            }\n\n            @Override\n            public void onAnimationEnd(Animation animation) {\n\n                \/\/ Shifts.setSummaryCursor.requery();\n\n\n            }\n        });\n\n    }\n\n}\n<\/code><\/pre>\n<ol>\n<li>\n<blockquote>\n<p>Hi guys, I&#8217;m getting some errors when trying to implement loader manager for use with my content provider and DB<\/p>\n<\/blockquote>\n<p>You&#8217;re trying to access a column from the cursor in the <code>getView<\/code> method which doesn&#8217;t exist in that cursor. I can&#8217;t help you with something else because I don&#8217;t know how you did the query(so check the columns that you use to get the String to be present in the query you make on the database).<\/p>\n<p>Also, I would advise you to follow some tutorials about adapters, what you currently do in the <code>getView<\/code> method(querying the database) is absolutely horrific. And you probably don&#8217;t need that query anyway as you should use the cursor returned by the loader(where you also set the adapter)<\/p>\n<\/li>\n<\/ol>\n<p id=\"rop\"><small>Originally posted 2013-11-29 06:18:20. <\/small><\/p>","protected":false},"excerpt":{"rendered":"<p>I&#8217;m getting some errors when trying to implement loader manager for use with my content provider and DB. I&#8217;ll start with logcat output: 1-19 16:37:33.628: I\/(20193): Loaded EGL implementation \/system\/lib\/\/egl\/libEGL_tegra_impl 01-19 16:37:33.648: I\/(20193): Loading GLESv2 implementation \/system\/lib\/\/egl\/libGLESv2_tegra_impl 01-19 16:37:33.883: E\/CursorWindow(20193): Failed to read row 0, column -1 from a CursorWindow which has 11 rows, 1 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1728","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/unknownerror.org\/index.php\/wp-json\/wp\/v2\/posts\/1728","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/unknownerror.org\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/unknownerror.org\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/unknownerror.org\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/unknownerror.org\/index.php\/wp-json\/wp\/v2\/comments?post=1728"}],"version-history":[{"count":0,"href":"https:\/\/unknownerror.org\/index.php\/wp-json\/wp\/v2\/posts\/1728\/revisions"}],"wp:attachment":[{"href":"https:\/\/unknownerror.org\/index.php\/wp-json\/wp\/v2\/media?parent=1728"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/unknownerror.org\/index.php\/wp-json\/wp\/v2\/categories?post=1728"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/unknownerror.org\/index.php\/wp-json\/wp\/v2\/tags?post=1728"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}