Android 滚动列表视图时显示错误的联系人照片

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

我正在开发一个加载器和列表查看简单的应用程序。它与whatsapp的联系人选项卡列表完全相同。此应用程序从手机获取联系人,并在列表项中显示姓名和图像。您可以在这里找到片段代码

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()中

非常感谢您。我错过了。