2015-12-28 31 views
0

我開發一個裝載機&列表視圖簡單的應用程序。它完全像whatsapp的CONTACTS選項卡列表。這個應用程序從手機獲取聯繫人並在列表項中顯示名稱和圖像。你可以在這裏找到片段代碼。顯示錯誤的聯繫人照片時滾動列表視圖

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; 
     } 
    } 
} 

貨品佈局文件: - contact_list_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> 

我的問題,應用程序顯示聯繫人信息和照片,但照片正在改變每一次,當我向上和向下滾動。這意味着一個聯繫人信息顯示與其他聯繫人的照片。

我錯過了什麼?

回答

2

使用

if(profileImage !=null){ 
     imageView.setImageBitmap(profileImage); 
}else{ 
     imageView.setImageDrawable(null); 
} 

您getview()內

+0

太謝謝你了。我錯過了。 –

相關問題