I have an activity with a fragment, I have a cursorloader in the fragment, all my code seems to be fine but for some reason in my onLoadFinished event the view just shows a loading circle and none of the contacts from the phone are displayed – here’s my code
PS. There are alot of comments from android documentation as I am still learning so bear with me
//SelectContactActivity.java package myrappah.com.myrapp; //import android.app.FragmentManager; import android.Manifest; import android.annotation.TargetApi; import android.content.ContentResolver; import android.content.pm.PackageManager; import android.database.Cursor; import android.os.Build; import android.provider.ContactsContract; import android.support.annotation.NonNull; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.Toast; import java.util.ArrayList; import java.util.List; import static android.Manifest.permission.READ_CONTACTS; public class SelectContactActivity extends AppCompatActivity { // The ListView private ListView lstNames; // Request code for READ_CONTACTS. It can be any number > 0. private static final int PERMISSIONS_REQUEST_READ_CONTACTS = 100; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_select_contact); FragmentManager fm = getSupportFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); SelectContactFragment selectContactFragment = new SelectContactFragment(); ft.add(R.id.fragment, selectContactFragment); ft.commit(); //showContacts(); } }
//SelectContactFragment.java package myrappah.com.myrapp; import android.annotation.SuppressLint; import android.database.Cursor; import android.net.Uri; import android.os.Build; import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.support.v4.widget.SimpleCursorAdapter; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.provider.ContactsContract; import android.support.v4.app.Fragment; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ListView; public class SelectContactFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor>, AdapterView.OnItemClickListener { @SuppressLint("InlinedApi") private final static String[] FROM_COLUMNS = { Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ? ContactsContract.Contacts.DISPLAY_NAME_PRIMARY : ContactsContract.Contacts.DISPLAY_NAME }; private final static int[] TO_IDS = { android.R.id.text1 }; @SuppressLint("InlinedApi") private static final String[] PROJECTION = { ContactsContract.Contacts._ID, ContactsContract.Contacts.LOOKUP_KEY, Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ? ContactsContract.Contacts.DISPLAY_NAME_PRIMARY : ContactsContract.Contacts.DISPLAY_NAME }; // The column index for the _ID column private static final int CONTACT_ID_INDEX = 0; // The column index for the LOOKUP_KEY column private static final int CONTACT_KEY_INDEX = 1; // Defines the text expression @SuppressLint("InlinedApi") private static final String SELECTION = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ? ContactsContract.Contacts.DISPLAY_NAME_PRIMARY + " LIKE ?" : ContactsContract.Contacts.DISPLAY_NAME + " LIKE ?"; // Defines a variable for the search string private String mSearchString; // Defines the array to hold values that replace the ? private String[] mSelectionArgs = { mSearchString }; ListView mContactsList; long mContactId; String mContactKey; Uri mContactUri; private SimpleCursorAdapter mCursorAdapter; // Empty public constructor, required by the system public SelectContactFragment() {} // A UI Fragment must inflate its View @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the fragment layout return inflater.inflate(R.layout.contacts_list_view, container, false); } public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); // Gets the ListView from the View list of the parent activity mContactsList = (ListView)getActivity().findViewById(android.R.id.list); // Gets a CursorAdapter mCursorAdapter = new SimpleCursorAdapter( getActivity(), R.layout.contacts_list_item, null, FROM_COLUMNS, TO_IDS, 0); // Sets the adapter for the ListView mContactsList.setAdapter(mCursorAdapter); // Set the item click listener to be the current fragment. mContactsList.setOnItemClickListener(this); getLoaderManager().initLoader(0, null, this); } @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { /* * Makes search string into pattern and * stores it in the selection array */ mSelectionArgs[0] = "%" + mSearchString + "%"; // Starts the query return new CursorLoader( getActivity(), ContactsContract.Contacts.CONTENT_URI, PROJECTION, SELECTION, mSelectionArgs, null ); } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { mCursorAdapter.swapCursor(data); //mCursorAdapter.notifyDataSetChanged(); } @Override public void onLoaderReset(Loader<Cursor> loader) { mCursorAdapter.swapCursor(null); } @Override public void onItemClick( AdapterView<?> parent, View item, int position, long rowID) { // Get the Cursor //Cursor cursor = parent.getAdapter().getCursor(); Cursor cursor = (Cursor) mCursorAdapter.getItem(position); // Move to the selected contact cursor.moveToPosition(position); // Get the _ID value mContactId = cursor.getLong(CONTACT_ID_INDEX); // Get the selected LOOKUP KEY mContactKey = cursor.getString(CONTACT_KEY_INDEX); // Create the contact's content Uri mContactUri = ContactsContract.Contacts.getLookupUri(mContactId, mContactKey); /* * You can use mContactUri as the content URI for retrieving * the details for a contact. */ } }
//activity_select_contact.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="myrappah.com.myrapp.SelectContactFragment"> <fragment android:id="@+id/fragment" android:name="android.support.v4.app.ListFragment" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" /> </LinearLayout>
//contact_list_view.xml <?xml version="1.0" encoding="utf-8"?> <ListView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@android:id/list" />
//contact_list_item.xml <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/text1" android:layout_width="match_parent" android:layout_height="wrap_content" android:clickable="true"/>