<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ContentProvider Archives - Truiton</title>
	<atom:link href="https://www.truiton.com/tag/contentprovider/feed/" rel="self" type="application/rss+xml" />
	<link></link>
	<description>Technology Reaching Us In Time - Online</description>
	<lastBuildDate>Thu, 21 Nov 2019 12:49:40 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://i0.wp.com/www.truiton.com/wp-content/uploads/2022/11/cropped-truiton_new_logo_half_white.png?fit=32%2C32&#038;ssl=1</url>
	<title>ContentProvider Archives - Truiton</title>
	<link></link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">54534495</site>	<item>
		<title>Android SimpleCursorTreeAdapter with CursorLoader for ExpandableListView</title>
		<link>https://www.truiton.com/2014/05/android-simplecursortreeadapter-cursorloader-expandablelistview/</link>
					<comments>https://www.truiton.com/2014/05/android-simplecursortreeadapter-cursorloader-expandablelistview/#comments</comments>
		
		<dc:creator><![CDATA[Mohit Gupt]]></dc:creator>
		<pubDate>Sun, 11 May 2014 15:27:06 +0000</pubDate>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[ContactsContract]]></category>
		<category><![CDATA[ContentProvider]]></category>
		<category><![CDATA[CursorLoader]]></category>
		<guid isPermaLink="false">http://www.truiton.com/?p=602</guid>

					<description><![CDATA[<p>Recently I learned a new concept, Android SimpleCursorTreeAdapters. As its name describes, its from Android SimpleCursorAdaper family. The only difference here is that Android SimpleCursorTreeAdapter is an adapter for ExpandableListView widget. In Android, SimpleCursorTreeAdapters are used in situations where one has to populate an expandable list view through a ContentProvider where the data to be&#8230;&#160;<a href="https://www.truiton.com/2014/05/android-simplecursortreeadapter-cursorloader-expandablelistview/" rel="bookmark">Read More &#187;<span class="screen-reader-text">Android SimpleCursorTreeAdapter with CursorLoader for ExpandableListView</span></a></p>
<p>The post <a href="https://www.truiton.com/2014/05/android-simplecursortreeadapter-cursorloader-expandablelistview/">Android SimpleCursorTreeAdapter with CursorLoader for ExpandableListView</a> appeared first on <a href="https://www.truiton.com">Truiton</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-image"><figure class="aligncenter"><img data-recalc-dims="1" fetchpriority="high" decoding="async" width="640" height="427" data-attachment-id="606" data-permalink="https://www.truiton.com/2014/05/android-simplecursortreeadapter-cursorloader-expandablelistview/httpwww/" data-orig-file="https://i0.wp.com/www.truiton.com/wp-content/uploads/2014/05/557840620_12701c1225_z.jpg?fit=640%2C427&amp;ssl=1" data-orig-size="640,427" data-comments-opened="1" data-image-title="http://www" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/www.truiton.com/wp-content/uploads/2014/05/557840620_12701c1225_z.jpg?fit=640%2C427&amp;ssl=1" src="https://i0.wp.com/www.truiton.com/wp-content/uploads/2014/05/557840620_12701c1225_z.jpg?resize=640%2C427" alt="Android SimpleCursorTreeAdapter" class="wp-image-606" srcset="https://i0.wp.com/www.truiton.com/wp-content/uploads/2014/05/557840620_12701c1225_z.jpg?w=640&amp;ssl=1 640w, https://i0.wp.com/www.truiton.com/wp-content/uploads/2014/05/557840620_12701c1225_z.jpg?resize=300%2C200&amp;ssl=1 300w" sizes="(max-width: 640px) 100vw, 640px" /></figure></div>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Recently I learned a new concept, Android SimpleCursorTreeAdapters. As its name describes, its from Android SimpleCursorAdaper family. The only difference here is that <a title="Android SimpleCursorTreeAdapter" href="http://developer.android.com/reference/android/widget/SimpleCursorTreeAdapter.html" target="_blank" rel="noopener noreferrer">Android SimpleCursorTreeAdapter</a> is an adapter for ExpandableListView widget. In Android, SimpleCursorTreeAdapters are used in situations where one has to populate an expandable list view through a <a title="Android Content Providers" href="http://developer.android.com/reference/android/content/ContentProvider.html" target="_blank" rel="noopener noreferrer">ContentProvider</a> where the data to be displayed is available. Another interesting concept that is often used with ListViews is Android CursorLoaders. In this <a title="Android SimpleCursorTreeAdapter with CursorLoader for ExpandableListView" href="http://www.truiton.com/2014/05/android-simplecursortreeadapter-cursorloader-expandablelistview/">Android SimpleCursorTreeAdapter with CursorLoader for ExpandableListView</a> Tutorial, I would also demonstrate how to use Android CursorLoader class with ExpandableListView.</p>



<p class="wp-block-paragraph">While working with ExpandableListView in Android many of you must have faced the problem of showing fresh content on screen. Consider a situation where you populate an ExpandableListView with the help of BaseExpandableListAdapter. In this situation one would have to write some sort of refresh logic, as here old data would be displayed when you navigate to some other screen and return back to the original screen where the list was displayed. Here steps in the Android <a title="Android CursorLoader" href="http://developer.android.com/reference/android/content/CursorLoader.html" target="_blank" rel="noopener noreferrer">CursorLoader</a> class. CursorLoaders is one of the essential elements which should be used with ExpandableListView if one wants to display large set of data efficiently and automatically without any refresh logic.</p>



<p class="wp-block-paragraph">In this <a title="Android SimpleCursorTreeAdapter with CursorLoader for ExpandableListView" href="http://www.truiton.com/2014/05/android-simplecursortreeadapter-cursorloader-expandablelistview/">Android SimpleCursorTreeAdapter with CursorLoader for ExpandableListView</a> tutorial I would be covering two android fundamentals :</p>



<ol class="wp-block-list"><li>Android SimpleCursorTreeAdapter</li><li>Android CursorLoader</li></ol>



<p class="wp-block-paragraph">In this tutorial I would use both SimpleCursorTreeAdapter and CursorLoader with Android Contacts Provider to show android phone book contacts in an ExpandableListView. To start off lets define a layout :</p>



<pre class="EnlighterJSRAW" data-enlighter-language="xml" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&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"
    tools:context=".TruitonExpandableListActivity" >

    &lt;ExpandableListView
        android:id="@+id/expandableListView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true" >
    &lt;/ExpandableListView>

&lt;/RelativeLayout></pre>



<p class="wp-block-paragraph">As you can see the layout for this Android SimpleCursorTreeAdapter with CursorLoader for ExpandableListView tutorial is very simple as only an ExpandableListView has to be populated with contacts. Lets move on to main part.</p>



<p class="wp-block-paragraph"></p>



<h2 class="wp-block-heading">1. Android SimpleCursorTreeAdapter</h2>



<p class="wp-block-paragraph">Android SimpleCursorTreeAdapter needs no introduction since it belongs to the CursorAdapter family of android. The added advantage of this type of adapter is that it can be used with ExpandableListViews and thus even the child elements can be queried by cursor. This gives us the freedom from maintaining states of database cursor. Lets define the SimpleCursorTreeAdapter class:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">package com.truiton.simplecursortreeadapter;

import java.util.HashMap;

import android.content.Context;
import android.database.Cursor;
import android.provider.ContactsContract;
import android.content.Loader;
import android.util.Log;
import android.widget.SimpleCursorTreeAdapter;

public class TruitonSimpleCursorTreeAdapter extends SimpleCursorTreeAdapter {

 private final String LOG_TAG = getClass().getSimpleName().toString();
 private TruitonExpandableListActivity mActivity;
 protected final HashMap&lt;Integer, Integer> mGroupMap;

 // Please Note: Here cursor is not provided to avoid querying on main
 // thread.
 public TruitonSimpleCursorTreeAdapter(Context context, int groupLayout,
 int childLayout, String[] groupFrom, int[] groupTo,
 String[] childrenFrom, int[] childrenTo) {

 super(context, null, groupLayout, groupFrom, groupTo, childLayout,
 childrenFrom, childrenTo);
 mActivity = (TruitonExpandableListActivity) context;
 mGroupMap = new HashMap&lt;Integer, Integer>();
 }

 @Override
 protected Cursor getChildrenCursor(Cursor groupCursor) {
 // Logic to get the child cursor on the basis of selected group.
 int groupPos = groupCursor.getPosition();
 int groupId = groupCursor.getInt(groupCursor
 .getColumnIndex(ContactsContract.Contacts._ID));

 Log.d(LOG_TAG, "getChildrenCursor() for groupPos " + groupPos);
 Log.d(LOG_TAG, "getChildrenCursor() for groupId " + groupId);

 mGroupMap.put(groupId, groupPos);
 Loader&lt;Cursor> loader = mActivity.getLoaderManager().getLoader(groupId);
 if (loader != null &amp;&amp; !loader.isReset()) {
 mActivity.getLoaderManager()
 .restartLoader(groupId, null, mActivity);
 } else {
 mActivity.getLoaderManager().initLoader(groupId, null, mActivity);
 }

 return null;
 }

 public HashMap&lt;Integer, Integer> getGroupMap() {
 return mGroupMap;
 }

}</pre>



<p class="wp-block-paragraph">Two important points to be noted in the constructor of this adapter are: first, that a cursor is not passed as an argument, as it would start loading on the UI thread, which can make the app slow. Since we are using Android CursorLoader, it will be initialized from there. Second point, that a group map is also initialized here, to keep the group position and ContactsContract.Contacts._ID mapping.</p>



<p class="wp-block-paragraph">Now the main method which is used in this implementation is the getChildrenCursor callback method. This method is called when user clicks on any group. Therefore here the logic to get child cursor can be applied.</p>



<p class="wp-block-paragraph"></p>



<h2 class="wp-block-heading">2. Android CursorLoader</h2>



<p class="wp-block-paragraph">Android is full of complex features one of those complex features is Android CursorLoader. CursorLoader is a class that queries the ContentProvider asynchronously in a background thread and delivers the result to the fragment or activity. When implementing the Android CursorLoader with&nbsp;SimpleCursorTreeAdapter do not forget to implement the interface <em>LoaderManager.LoaderCallbacks&lt;Cursor&gt;</em> on the calling activity or fragment. The documentation states that this needs to be implemented on the UI thread.</p>



<p class="wp-block-paragraph">The minimum requirement to start a loader is to define an <em>id</em> through which a particular instance of Android CursorLoader is identified. Lets define the activity now:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">package com.truiton.simplecursortreeadapter;

import java.util.HashMap;

import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.content.CursorLoader;
import android.app.Activity;
import android.content.Loader;
import android.database.Cursor;
import android.util.Log;
import android.view.Menu;
import android.widget.ExpandableListView;
import android.app.LoaderManager;

public class TruitonExpandableListActivity extends Activity implements
 LoaderManager.LoaderCallbacks&lt;Cursor> {

 private final String LOG_TAG = getClass().getSimpleName().toString();

 private static final String[] PHONE_PROJECTION = new String[] {
 ContactsContract.CommonDataKinds.Phone._ID,
 ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
 ContactsContract.CommonDataKinds.Phone.NUMBER,
 ContactsContract.CommonDataKinds.Phone.TYPE };

 private static final String[] CONTACT_PROJECTION = new String[] {
 ContactsContract.Contacts._ID,
 ContactsContract.Contacts.DISPLAY_NAME };

 TruitonSimpleCursorTreeAdapter mAdapter;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);

 ExpandableListView expandableContactListView = (ExpandableListView) findViewById(R.id.expandableListView1);

 mAdapter = new TruitonSimpleCursorTreeAdapter(this,
 android.R.layout.simple_expandable_list_item_1,
 android.R.layout.simple_expandable_list_item_1,
 new String[] { ContactsContract.Contacts.DISPLAY_NAME },
 new int[] { android.R.id.text1 },
 new String[] { ContactsContract.CommonDataKinds.Phone.NUMBER },
 new int[] { android.R.id.text1 });

 expandableContactListView.setAdapter(mAdapter);

 Loader&lt;Cursor> loader = getLoaderManager().getLoader(-1);
 if (loader != null &amp;&amp; !loader.isReset()) {
 getLoaderManager().restartLoader(-1, null, this);
 } else {
 getLoaderManager().initLoader(-1, null, this);
 }
 }

 public Loader&lt;Cursor> onCreateLoader(int id, Bundle args) {
 Log.d(LOG_TAG, "onCreateLoader for loader_id " + id);
 CursorLoader cl;
 if (id != -1) {
 // child cursor
 Uri contactsUri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
 String selection = "("
 + ContactsContract.CommonDataKinds.Phone.CONTACT_ID
 + " = ? )";
 String sortOrder = ContactsContract.CommonDataKinds.Phone.TYPE
 + " COLLATE LOCALIZED ASC";
 String[] selectionArgs = new String[] { String.valueOf(id) };

 cl = new CursorLoader(this, contactsUri, PHONE_PROJECTION,
 selection, selectionArgs, sortOrder);
 } else {
 // group cursor
 Uri contactsUri = ContactsContract.Contacts.CONTENT_URI;
 String selection = "((" + ContactsContract.Contacts.DISPLAY_NAME
 + " NOTNULL) AND ("
 + ContactsContract.Contacts.HAS_PHONE_NUMBER + "=1) AND ("
 + ContactsContract.Contacts.DISPLAY_NAME + " != '' ))";
 String sortOrder = ContactsContract.Contacts.DISPLAY_NAME
 + " COLLATE LOCALIZED ASC";
 cl = new CursorLoader(this, contactsUri, CONTACT_PROJECTION,
 selection, null, sortOrder);
 }

 return cl;
 }

 public void onLoadFinished(Loader&lt;Cursor> loader, Cursor data) {
 // Setting the new cursor onLoadFinished. (Old cursor would be closed
 // automatically)
 int id = loader.getId();
 Log.d(LOG_TAG, "onLoadFinished() for loader_id " + id);
 if (id != -1) {
 // child cursor
 if (!data.isClosed()) {
 Log.d(LOG_TAG, "data.getCount() " + data.getCount());

 HashMap&lt;Integer, Integer> groupMap = mAdapter.getGroupMap();
 try {
 int groupPos = groupMap.get(id);
 Log.d(LOG_TAG, "onLoadFinished() for groupPos " + groupPos);
 mAdapter.setChildrenCursor(groupPos, data);
 } catch (NullPointerException e) {
 Log.w(LOG_TAG,
 "Adapter expired, try again on the next query: "
 + e.getMessage());
 }
 }
 } else {
 mAdapter.setGroupCursor(data);
 }

 }

 public void onLoaderReset(Loader&lt;Cursor> loader) {
 // Called just before the cursor is about to be closed.
 int id = loader.getId();
 Log.d(LOG_TAG, "onLoaderReset() for loader_id " + id);
 if (id != -1) {
 // child cursor
 try {
 mAdapter.setChildrenCursor(id, null);
 } catch (NullPointerException e) {
 Log.w(LOG_TAG, "Adapter expired, try again on the next query: "
 + e.getMessage());
 }
 } else {
 mAdapter.setGroupCursor(null);
 }
 }
}</pre>



<p class="wp-block-paragraph">In the above activity I have defined two projections for Android CursorLoader, first PHONE_PROJECTION and second one the CONTACT_PROJECTION.</p>



<p class="wp-block-paragraph"><span style="text-decoration: underline;"><strong>Please Note:</strong></span> Do not forget to define the _ID in projections as this would result in an &#8220;java.lang.IllegalStateException: Couldn&#8217;t read row 0, col -1 from CursorWindow.&nbsp; Make sure the Cursor is initialized correctly before accessing data from it.&#8221; exception.</p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">In onCreate Android SimpleCursorTreeAdapter along with CursorLoader is initialized. Once the Android CursorLoader is initialized its callback methods like onCreateLoader(), onLoadFinished(), and onLoaderReset() are called accordingly. The flow is like, in onCreateLoader() method a query to the ContentProvider is made. Then when load is finished onLoadFinished() method is called and the cursor is set in Android SimpleCursorTreeAdapter. When the cursor is about to be closed onLoaderReset() method is called and adapter cursors are nullified as they need to be re initialized. Usually this method is called by android framework when the data has changed. After the implementation it would look something like this:</p>



<div class="wp-block-image size-full wp-image-605"><figure class="aligncenter"><img data-recalc-dims="1" decoding="async" width="332" height="590" data-attachment-id="605" data-permalink="https://www.truiton.com/2014/05/android-simplecursortreeadapter-cursorloader-expandablelistview/simplecursortreeadapter/" data-orig-file="https://i0.wp.com/www.truiton.com/wp-content/uploads/2014/05/SimpleCursorTreeAdapter.png?fit=332%2C590&amp;ssl=1" data-orig-size="332,590" data-comments-opened="1" data-image-title="Android SimpleCursorTreeAdapter" data-image-description="&lt;p&gt;Android SimpleCursorTreeAdapter&lt;/p&gt;
" data-image-caption="&lt;p&gt;Android SimpleCursorTreeAdapter&lt;/p&gt;
" data-large-file="https://i0.wp.com/www.truiton.com/wp-content/uploads/2014/05/SimpleCursorTreeAdapter.png?fit=332%2C590&amp;ssl=1" src="https://i0.wp.com/www.truiton.com/wp-content/uploads/2014/05/SimpleCursorTreeAdapter.png?resize=332%2C590" alt="Android SimpleCursorTreeAdapter" class="wp-image-605" srcset="https://i0.wp.com/www.truiton.com/wp-content/uploads/2014/05/SimpleCursorTreeAdapter.png?w=332&amp;ssl=1 332w, https://i0.wp.com/www.truiton.com/wp-content/uploads/2014/05/SimpleCursorTreeAdapter.png?resize=168%2C300&amp;ssl=1 168w" sizes="(max-width: 332px) 100vw, 332px" /><figcaption>Android SimpleCursorTreeAdapter</figcaption></figure></div>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">After implementing this you would see a screen displaying all the contacts of your device, by clicking on any of the contacts you would be able to view the phone numbers associated with that contact. Now if you press the home button and edit a contact and then open this screen again, you would see the changed data here. The point to be noted here is that this is done through the <a title="Android SimpleCursorTreeAdapter with CursorLoader for ExpandableListView" href="http://www.truiton.com/2014/05/android-simplecursortreeadapter-cursorloader-expandablelistview/">Android SimpleCursorTreeAdapter with CursorLoader for ExpandableListView</a> and not by re-querying the content provider manually in onResume(). Hope this helped, if it did please share this with your friends on Facebook and Google+ also please like our page at Facebook for updates.</p>
<div class="saboxplugin-wrap" itemtype="http://schema.org/Person" itemscope itemprop="author"><div class="saboxplugin-tab"><div class="saboxplugin-gravatar"><img alt='Mohit Gupt' src='https://secure.gravatar.com/avatar/a816092ad56645d2635ccfceb9f7e9d44821c19dec126cb394c882ba574eaa04?s=100&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/a816092ad56645d2635ccfceb9f7e9d44821c19dec126cb394c882ba574eaa04?s=200&#038;d=mm&#038;r=g 2x' class='avatar avatar-100 photo' height='100' width='100' itemprop="image"/></div><div class="saboxplugin-authorname"><a href="https://www.truiton.com/author/mohitgupt/" class="vcard author" rel="author"><span class="fn">Mohit Gupt</span></a></div><div class="saboxplugin-desc"><div itemprop="description"><p>Born in New Delhi, India. A software engineer by profession, an android enthusiast and mobile development evangelist. My motive here is to create a group of skilled engineers, who can build better software. Reason being programming is my passion, and also it feels good to make a device do something you want. Professionally I have worked with many software engineering and product development firms. As of now too, I am employed as a senior engineer in a leading tech company. In total I may have worked on more than 20 projects professionally, but whenever I get spare time I share my thoughts here at Truiton.</p>
</div></div><div class="saboxplugin-web "><a href="http://www.truiton.com" target="_self" >www.truiton.com</a></div><div class="clearfix"></div><div class="saboxplugin-socials "><a title="Wordpress" target="_blank" href="https://www.truiton.com/author/mohitgupt/" rel="nofollow noopener" class="saboxplugin-icon-grey"><svg aria-hidden="true" class="sab-wordpress" role="img" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 512 512"><path fill="currentColor" d="M61.7 169.4l101.5 278C92.2 413 43.3 340.2 43.3 256c0-30.9 6.6-60.1 18.4-86.6zm337.9 75.9c0-26.3-9.4-44.5-17.5-58.7-10.8-17.5-20.9-32.4-20.9-49.9 0-19.6 14.8-37.8 35.7-37.8.9 0 1.8.1 2.8.2-37.9-34.7-88.3-55.9-143.7-55.9-74.3 0-139.7 38.1-177.8 95.9 5 .2 9.7.3 13.7.3 22.2 0 56.7-2.7 56.7-2.7 11.5-.7 12.8 16.2 1.4 17.5 0 0-11.5 1.3-24.3 2l77.5 230.4L249.8 247l-33.1-90.8c-11.5-.7-22.3-2-22.3-2-11.5-.7-10.1-18.2 1.3-17.5 0 0 35.1 2.7 56 2.7 22.2 0 56.7-2.7 56.7-2.7 11.5-.7 12.8 16.2 1.4 17.5 0 0-11.5 1.3-24.3 2l76.9 228.7 21.2-70.9c9-29.4 16-50.5 16-68.7zm-139.9 29.3l-63.8 185.5c19.1 5.6 39.2 8.7 60.1 8.7 24.8 0 48.5-4.3 70.6-12.1-.6-.9-1.1-1.9-1.5-2.9l-65.4-179.2zm183-120.7c.9 6.8 1.4 14 1.4 21.9 0 21.6-4 45.8-16.2 76.2l-65 187.9C426.2 403 468.7 334.5 468.7 256c0-37-9.4-71.8-26-102.1zM504 256c0 136.8-111.3 248-248 248C119.2 504 8 392.7 8 256 8 119.2 119.2 8 256 8c136.7 0 248 111.2 248 248zm-11.4 0c0-130.5-106.2-236.6-236.6-236.6C125.5 19.4 19.4 125.5 19.4 256S125.6 492.6 256 492.6c130.5 0 236.6-106.1 236.6-236.6z"></path></svg></span></a><a title="Twitter" target="_blank" href="http://twitter.com/mohitgupt" rel="nofollow noopener" class="saboxplugin-icon-grey"><svg aria-hidden="true" class="sab-twitter" role="img" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 30 30"><path d="M26.37,26l-8.795-12.822l0.015,0.012L25.52,4h-2.65l-6.46,7.48L11.28,4H4.33l8.211,11.971L12.54,15.97L3.88,26h2.65 l7.182-8.322L19.42,26H26.37z M10.23,6l12.34,18h-2.1L8.12,6H10.23z" /></svg></span></a><a title="Facebook" target="_blank" href="https://www.facebook.com/Mr.Mohit.Gupt" rel="nofollow noopener" class="saboxplugin-icon-grey"><svg aria-hidden="true" class="sab-facebook" role="img" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 264 512"><path fill="currentColor" d="M76.7 512V283H0v-91h76.7v-71.7C76.7 42.4 124.3 0 193.8 0c33.3 0 61.9 2.5 70.2 3.6V85h-48.2c-37.8 0-45.1 18-45.1 44.3V192H256l-11.7 91h-73.6v229"></path></svg></span></a></div></div></div><p>The post <a href="https://www.truiton.com/2014/05/android-simplecursortreeadapter-cursorloader-expandablelistview/">Android SimpleCursorTreeAdapter with CursorLoader for ExpandableListView</a> appeared first on <a href="https://www.truiton.com">Truiton</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.truiton.com/2014/05/android-simplecursortreeadapter-cursorloader-expandablelistview/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">602</post-id>	</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Page Caching using Disk: Enhanced 
Minified using Disk

Served from: www.truiton.com @ 2026-07-08 02:01:48 by W3 Total Cache
-->