我正在尝试创建一个通过查询联系人db构建的列表视图。我正在使用simplecursoradpater并且工作正常,直到我将其限制为联系人姓名。
如何使用simplecursoradpater将电子邮件和缩略图照片绑定到视图。
我是Android的新手,这有点令人困惑。救命啊!
答案 0 :(得分:0)
试试这个
public class ViewBinder implements SimpleCursorAdapter.ViewBinder {
public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
if(view.getId()==R.id.thumbnail) {
ImageView iv = (ImageView) view;
byte[] img = cursor.getBlob(columnIndex);
iv.setImageBitmap(BitmapFactory.decodeByteArray(img, 0, img.length));
return true;
}
return false;
}
public String getViewValue(View view, Cursor cursor) {
String name ="";
if(view instanceof TextView) {
name=cursor.getString(1);
}
return name;
}
}
答案 1 :(得分:0)
Use the following code to display name,number,photo etc.
activity_main.xml
<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" >
<ListView
android:id="@+id/lst_contacts"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
lv_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<ImageView
android:id="@+id/iv_photo"
android:layout_width="70dp"
android:layout_height="70dp"
android:contentDescription="desc"
android:paddingLeft="10dp"
android:paddingRight="10dp" />
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_toRightOf="@+id/iv_photo"
android:paddingBottom="10dp"
android:textSize="20sp"
android:textStyle="bold" />
<TextView
android:id="@+id/tv_details"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/tv_name"
android:layout_below="@+id/tv_name"
android:textSize="16sp" />
</RelativeLayout>
Mainactivity.java
public class MainActivity extends Activity
{
SimpleCursorAdapter mAdapter;
MatrixCursor mMatrixCursor;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
// The contacts from the contacts content provider is stored in this cursor
mMatrixCursor = new MatrixCursor(new String[] { "_id", "name","photo", "details" });
} catch (Exception e)
{
e.printStackTrace();
}
finally
{
try
{
if (mMatrixCursor != null && !mMatrixCursor.isClosed())
{
mMatrixCursor.close();
}
} catch (Exception e)
{
}
}
// Adapter to set data in the listview
mAdapter = new SimpleCursorAdapter(getBaseContext(),R.layout.lv_layout, null, new String[] { "name", "photo","details" }, new int[] { R.id.tv_name, R.id.iv_photo,R.id.tv_details }, 0);
// Getting reference to listview
ListView lstContacts = (ListView) findViewById(R.id.lst_contacts);
// Setting the adapter to listview
lstContacts.setAdapter(mAdapter);
// Creating an AsyncTask object to retrieve and load listview with contacts
ListViewContactsLoader listViewContactsLoader = new ListViewContactsLoader();
// Starting the AsyncTask process to retrieve and load listview with contacts
listViewContactsLoader.execute();
}
/** An AsyncTask class to retrieve and load listview with contacts */
private class ListViewContactsLoader extends AsyncTask<Void, Void, Cursor> {
Cursor contactsCursor;
Cursor dataCursor;
@Override
protected Cursor doInBackground(Void... params) {
Uri contactsUri = ContactsContract.Contacts.CONTENT_URI;
// Querying the table ContactsContract.Contacts to retrieve all the
// contacts
try {
contactsCursor = getContentResolver().query(contactsUri, null,null, null,ContactsContract.Contacts.DISPLAY_NAME + " ASC ");
if (contactsCursor.moveToFirst()) {
try {
do {
long contactId = contactsCursor.getLong(contactsCursor.getColumnIndex("_ID"));
Uri dataUri = ContactsContract.Data.CONTENT_URI;
// Querying the table ContactsContract.Data to
// retrieve
// individual items like
// home phone, mobile phone, work email etc
// corresponding to
// each contact
dataCursor = getContentResolver().query(dataUri,null,ContactsContract.Data.CONTACT_ID + "="+ contactId, null, null);
String displayName = "";
String nickName = "";
String homePhone = "";
String mobilePhone = "";
String workPhone = "";
String photoPath = "" + R.drawable.blank;
byte[] photoByte = null;
String homeEmail = "";
String workEmail = "";
String companyName = "";
String title = "";
if (dataCursor.moveToFirst())
{
// Getting Display Name
displayName = dataCursor.getString(dataCursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME));
do {
// Getting NickName
if (dataCursor.getString(dataCursor.getColumnIndex("mimetype")).equals(ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE))
nickName = dataCursor.getString(dataCursor.getColumnIndex("data1"));
// Getting Phone numbers
if (dataCursor.getString(dataCursor.getColumnIndex("mimetype")).equals(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE))
{
switch (dataCursor.getInt(dataCursor.getColumnIndex("data2")))
{
case ContactsContract.CommonDataKinds.Phone.TYPE_HOME:
homePhone = dataCursor.getString(dataCursor.getColumnIndex("data1"));
break;
case ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE:
mobilePhone = dataCursor.getString(dataCursor.getColumnIndex("data1"));
break;
case ContactsContract.CommonDataKinds.Phone.TYPE_WORK:
workPhone = dataCursor.getString(dataCursor.getColumnIndex("data1"));
break;
}
}
// Getting EMails
if (dataCursor.getString(dataCursor.getColumnIndex("mimetype")).equals(ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE))
{
switch (dataCursor.getInt(dataCursor.getColumnIndex("data2")))
{
case ContactsContract.CommonDataKinds.Email.TYPE_HOME:
homeEmail = dataCursor.getString(dataCursor.getColumnIndex("data1"));
break;
case ContactsContract.CommonDataKinds.Email.TYPE_WORK:
workEmail = dataCursor.getString(dataCursor.getColumnIndex("data1"));
break;
}
}
// Getting Organization details
if (dataCursor.getString(dataCursor.getColumnIndex("mimetype")).equals(ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE))
{
companyName = dataCursor.getString(dataCursor.getColumnIndex("data1"));
title = dataCursor.getString(dataCursor.getColumnIndex("data4"));
}
// Getting Photo
if (dataCursor.getString(dataCursor.getColumnIndex("mimetype")).equals(ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE))
{
photoByte = dataCursor.getBlob(dataCursor.getColumnIndex("data15"));
if (photoByte != null)
{
Bitmap bitmap = BitmapFactory.decodeByteArray(photoByte,0, photoByte.length);
// Getting Caching directory
File cacheDirectory = getBaseContext().getCacheDir();
// Temporary file to store the
// contact
// image
File tmpFile = new File(cacheDirectory.getPath()+ "/wpta_"+ contactId+ ".png");
// The FileOutputStream to the
// temporary
// file
try {
FileOutputStream fOutStream = new FileOutputStream(tmpFile);
// Writing the bitmap to the
// temporary
// file as png file
bitmap.compress(Bitmap.CompressFormat.PNG,100, fOutStream);
// Flush the FileOutputStream
fOutStream.flush();
// Close the FileOutputStream
fOutStream.close();
} catch (Exception e) {
e.printStackTrace();
}
photoPath = tmpFile.getPath();
}
}
} while (dataCursor.moveToNext());
String details = "";
// Concatenating various information to single
// string
if (homePhone != null && !homePhone.equals(""))
details = "HomePhone : " + homePhone + "\n";
if (mobilePhone != null&& !mobilePhone.equals(""))
details += "MobilePhone : " + mobilePhone
+ "\n";
if (workPhone != null && !workPhone.equals(""))
details += "WorkPhone : " + workPhone
+ "\n";
if (nickName != null && !nickName.equals(""))
details += "NickName : " + nickName + "\n";
if (homeEmail != null && !homeEmail.equals(""))
details += "HomeEmail : " + homeEmail
+ "\n";
if (workEmail != null && !workEmail.equals(""))
details += "WorkEmail : " + workEmail
+ "\n";
if (companyName != null&& !companyName.equals(""))
details += "CompanyName : " + companyName+ "\n";
if (title != null && !title.equals(""))
details += "Title : " + title + "\n";
// Adding id, display name, path to photo and
// other
// details to cursor
mMatrixCursor.addRow(new Object[] {Long.toString(contactId), displayName,photoPath, details });
}
} while (contactsCursor.moveToNext());
} catch (Exception e)
{
e.printStackTrace();
} finally
{
try {
if (dataCursor != null && !dataCursor.isClosed())
dataCursor.close();
} catch (Exception ex)
{
ex.printStackTrace();
}
}
}
} catch (Exception e)
{
e.printStackTrace();
}
finally
{
try {
if (contactsCursor != null && !contactsCursor.isClosed())
contactsCursor.close();
} catch (Exception ex)
{
ex.printStackTrace();
}
}
return mMatrixCursor;
}
@Override
protected void onPostExecute(Cursor result) {
// Setting the cursor containing contacts to listview
mAdapter.swapCursor(result);
}
}
}