Android 滚动列表视图时显示错误的联系人照片
我正在开发一个加载器和列表查看简单的应用程序。它与whatsapp的联系人选项卡列表完全相同。此应用程序从手机获取联系人,并在列表项中显示姓名和图像。您可以在这里找到片段代码Android 滚动列表视图时显示错误的联系人照片,android,android-cursorloader,Android,Android Cursorloader,我正在开发一个加载器和列表查看简单的应用程序。它与whatsapp的联系人选项卡列表完全相同。此应用程序从手机获取联系人,并在列表项中显示姓名和图像。您可以在这里找到片段代码 import android.content.ContentUris; import android.content.Context; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.Bitmap
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.support.v4.app.ListFragment;
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.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CursorAdapter;
import android.widget.ImageView;
import android.widget.ResourceCursorAdapter;
import android.widget.TextView;
import java.io.InputStream;
public class TabThreeFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor> {
MyCursorAdapter mAdapter;
SimpleCursorAdapter s;
public static final String TAG = "TabThreeFragment";
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setEmptyText("No phone numbers");
mAdapter = new MyCursorAdapter(getActivity(), R.layout.contact_list_item, null, 0 );
setListAdapter(mAdapter);
getLoaderManager().initLoader(0, null, this);
}
static final String[] CONTACTS_SUMMARY_PROJECTION = new String[] {
ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts.CONTACT_STATUS,
ContactsContract.Contacts.CONTACT_PRESENCE,
ContactsContract.Contacts.PHOTO_ID,
ContactsContract.Contacts.LOOKUP_KEY,
};
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
Log.d(TAG, "onCreateLoader");
Uri baseUri = ContactsContract.Contacts.CONTENT_URI;
String select = "((" + ContactsContract.Contacts.DISPLAY_NAME + " NOTNULL) AND ("
+ ContactsContract.Contacts.HAS_PHONE_NUMBER + "=1) AND ("
+ ContactsContract.Contacts.DISPLAY_NAME + " != '' ))";
return new CursorLoader(getActivity(), baseUri,
CONTACTS_SUMMARY_PROJECTION, select, null,
ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC");
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
Log.d(TAG, "onLoadFinished");
mAdapter.swapCursor(data);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
mAdapter.swapCursor(null);
}
class MyCursorAdapter extends ResourceCursorAdapter{
public MyCursorAdapter(Context context, int layout, Cursor c, int flags) {
super(context, layout, c, flags);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
TextView contactName = (TextView) view.findViewById(R.id.textView1);
contactName.setText(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));
ImageView imageView = (ImageView) view.findViewById(R.id.profileImage);
Bitmap profileImage = getPhoto(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)));
//TextView ID = (TextView) view.findViewById(R.id.textView2);
if(profileImage !=null)
{
imageView.setImageBitmap(profileImage);
}
}
private Bitmap getPhoto(String id){
Log.d(TAG, id + "-----");
Bitmap photo = null;
try{
InputStream inputStream = ContactsContract.Contacts.openContactPhotoInputStream(
getActivity().getContentResolver(),
ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI , new Long(id).longValue()));
if(inputStream != null)
photo= BitmapFactory.decodeStream(inputStream);
}catch (Exception e){
}
return photo;
}
}
}
导入android.content.ContentUris;
导入android.content.Context;
导入android.database.Cursor;
导入android.graphics.Bitmap;
导入android.graphics.BitmapFactory;
导入android.net.Uri;
导入android.os.Bundle;
导入android.provider.contacts合同;
导入android.support.v4.app.ListFragment;
导入android.support.v4.app.LoaderManager;
导入android.support.v4.content.CursorLoader;
导入android.support.v4.content.Loader;
导入android.support.v4.widget.SimpleCursorAdapter;
导入android.util.Log;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.CursorAdapter;
导入android.widget.ImageView;
导入android.widget.ResourceCursorAdapter;
导入android.widget.TextView;
导入java.io.InputStream;
公共类TabThreeFragment扩展ListFragment实现LoaderManager.LoaderCallbacks{
MyCursorAdapter mAdapter;
单纯形适应器s;
公共静态最终字符串TAG=“TabThreeFragment”;
@凌驾
已创建ActivityState上的公共无效(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
setEmptyText(“无电话号码”);
mAdapter=new MyCursorAdapter(getActivity(),R.layout.contact\u list\u项,null,0);
setListAdapter(mAdapter);
getLoaderManager().initLoader(0,null,this);
}
静态最终字符串[]联系人\u摘要\u投影=新字符串[]{
联系人合同联系人。\u ID,
Contacts contract.Contacts.DISPLAY\u NAME,
Contacts contract.Contacts.CONTACT\u状态,
联系人contract.Contacts.CONTACT\u在场,
Contacts contract.Contacts.PHOTO_ID,
Contacts contract.Contacts.LOOKUP_键,
};
@凌驾
公共加载器onCreateLoader(int-id,Bundle-args){
Log.d(标记“onCreateLoader”);
Uri baseUri=ContactsContract.Contacts.CONTENT\u Uri;
String select=“(“+ContactsContract.Contacts.DISPLAY_NAME+”NOTNULL)和(”
+Contacts contract.Contacts.HAS_电话号码+“=1)和(”
+Contacts contract.Contacts.DISPLAY_NAME+“!=”);
返回新的游标装入器(getActivity(),baseUri,
联系人\u摘要\u投影,选择,空,
Contacts contract.Contacts.DISPLAY_NAME+“核对本地化ASC”);
}
@凌驾
public void onLoadFinished(加载器、光标数据){
Log.d(标记“onLoadFinished”);
mAdapter.swapCursor(数据);
}
@凌驾
公共void onLoaderReset(加载器){
mAdapter.swapCursor(空);
}
类MyCursorAdapter扩展了ResourceCursorAdapter{
公共MyCursorAdapter(上下文上下文、int布局、游标c、int标志){
超级(上下文、布局、c、标志);
}
@凌驾
公共void bindView(视图、上下文上下文、光标){
TextView contactName=(TextView)view.findViewById(R.id.textView1);
contactName.setText(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
ImageView=(ImageView)view.findViewById(R.id.profileImage);
位图profileImage=getPhoto(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.\u ID));
//TextView ID=(TextView)view.findViewById(R.ID.textView2);
if(profileImage!=null)
{
设置图像位图(profileImage);
}
}
私有位图getPhoto(字符串id){
Log.d(标记,id+“----”;
位图照片=空;
试一试{
InputStream InputStream=ContactsContract.Contacts.OpenContactsPhotoInputStream(
getActivity().getContentResolver(),
ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI,新的Long(id).longValue());
如果(inputStream!=null)
photo=BitmapFactory.decodeStream(inputStream);
}捕获(例外e){
}
返回照片;
}
}
}
列表项布局文件:-联系\u List\u Item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="wrap_content" android:gravity="center_vertical" android:layout_marginLeft="8dp"
android:layout_marginRight="8dp" android:layout_marginTop="6dp" android:layout_marginBottom="6dp">
<ImageView android:id="@+id/profileImage"
android:src="@drawable/ic_launcher"
android:layout_weight="0" android:layout_width="50dp"
android:layout_height="50dp"/>
<LinearLayout android:orientation="vertical"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="6dp"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="Medium Text"
android:id="@+id/textView1" />
<TextView
android:id="@+id/textView2"
android:paddingLeft="6dp"
android:textSize="16dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Dummy Content fro subtile"
/>
</LinearLayout>>
</LinearLayout>
>
我的问题是,应用程序会显示联系人详细信息和照片,但每次我上下滚动时,照片都会发生变化。这意味着一个联系人信息与另一个联系人的照片一起显示
我错过了什么吗?使用
if(profileImage !=null){
imageView.setImageBitmap(profileImage);
}else{
imageView.setImageDrawable(null);
}
在您的getview()中非常感谢您。我错过了。