Skip to content

Instantly share code, notes, and snippets.

@slightfoot
Last active February 8, 2022 12:34
Show Gist options
  • Save slightfoot/7023eeb3d92fc8ede341 to your computer and use it in GitHub Desktop.
Save slightfoot/7023eeb3d92fc8ede341 to your computer and use it in GitHub Desktop.
Contacts photo list example
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<ImageView
android:id="@+id/contact_photo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
/>
<TextView
android:id="@+id/contact_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom|fill_horizontal"
android:textAppearance="?android:attr/textAppearanceMedium"
android:gravity="start|bottom"
android:background="#7F000000"
android:textColor="#FFFFFF"
android:minLines="2"
android:maxLines="2"
android:paddingTop="4dp"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:paddingBottom="4dp"
/>
</FrameLayout>
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.CursorAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;
public class MainActivity extends FragmentActivity implements LoaderCallbacks<Cursor>
{
private ContactsAdapter mContactsAdapter;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
mContactsAdapter = new ContactsAdapter(this);
GridView gridView = new GridView(this);
gridView.setAdapter(mContactsAdapter);
gridView.setStretchMode(GridView.STRETCH_COLUMN_WIDTH);
gridView.setNumColumns(2);
setContentView(gridView);
getSupportLoaderManager().initLoader(0, null, this);
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args)
{
return new CursorLoader(this, ContactsContract.Contacts.CONTENT_URI,
new String[ ] {
ContactsContract.Contacts._ID,
ContactsContract.Contacts.LOOKUP_KEY,
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts.PHOTO_THUMBNAIL_URI,
},
ContactsContract.Contacts.PHOTO_ID + " != 0", null,
ContactsContract.Contacts.DISPLAY_NAME + " ASC");
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data)
{
mContactsAdapter.changeCursor(data);
}
@Override
public void onLoaderReset(Loader<Cursor> loader)
{
mContactsAdapter.changeCursor(null);
}
private static class ContactsAdapter extends CursorAdapter
{
private int mIndexLookupKey;
private int mIndexDisplayName;
private int mIndexPhotoUri;
public ContactsAdapter(Context context)
{
super(context, null, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
}
@Override
public Cursor swapCursor(Cursor newCursor)
{
if(newCursor != null){
mIndexLookupKey = newCursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY);
mIndexDisplayName = newCursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
mIndexPhotoUri = newCursor.getColumnIndex(ContactsContract.Contacts.PHOTO_THUMBNAIL_URI);
}
return super.swapCursor(newCursor);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent)
{
return ViewHolder.create(parent);
}
@Override
public void bindView(View view, Context context, Cursor cursor)
{
final String lookupKey = cursor.getString(mIndexLookupKey);
final String displayName = cursor.getString(mIndexDisplayName);
final String photoUri = cursor.getString(mIndexPhotoUri);
ViewHolder.get(view).bind(displayName, photoUri,
Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey));
}
private static class ViewHolder implements View.OnClickListener
{
private ViewGroup mLayout;
private ImageView mContactPhoto;
private TextView mContactName;
private Uri mLookupUri;
public static final ViewGroup create(ViewGroup parent)
{
return new ViewHolder(parent).mLayout;
}
public static final ViewHolder get(View parent)
{
return (ViewHolder)parent.getTag();
}
private ViewHolder(ViewGroup parent)
{
Context context = parent.getContext();
mLayout = (ViewGroup)LayoutInflater.from(context).inflate(R.layout.item_contact, parent, false);
mLayout.setOnClickListener(this);
mLayout.setTag(this);
mContactPhoto = (ImageView)mLayout.findViewById(R.id.contact_photo);
mContactName = (TextView)mLayout.findViewById(R.id.contact_name);
}
public void bind(String displayName, String photoUri, Uri lookupUri)
{
if(photoUri != null){
mContactPhoto.setImageURI(Uri.parse(photoUri));
}else{
mContactPhoto.setImageDrawable(null);
}
mContactName.setText(displayName);
mLookupUri = lookupUri;
}
@Override
public void onClick(View v)
{
ContactsContract.QuickContact.showQuickContact(v.getContext(),
v, mLookupUri, ContactsContract.QuickContact.MODE_MEDIUM, null);
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment