2012-02-04 2 views
1

Я строю небольшое смс-приложение. Я сделал список списков разговора, но есть проблема. В каждой строке списка есть фотография (контактная фотография), и если я прокручиваю вниз, некоторые строки имеют фотографии из разных строк (начиная с начала списка).Повторные элементы в ListView (фотографии)

Вот мой адаптер:

import android.content.ContentResolver; 
import android.content.Context; 
import android.database.Cursor; 
import android.graphics.Bitmap; 
import android.text.format.DateUtils; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.widget.ImageView; 
import android.widget.SimpleCursorAdapter; 
import android.widget.TextView; 

public class ConversationAdapter extends SimpleCursorAdapter { 
    private final String TAG = "ConversationAdapter"; 
    static final String[] FROM = {"body", "address", "date", "m_size"}; 
    static final int[] TO = {R.id.textMsg, R.id.textPerson, R.id.textDate, R.id.textConvCounter}; 
    ImageView imageAvatar; 
    ContentResolver contentResolver; 
    LayoutInflater layoutInflater; 

    public ConversationAdapter(Context context, Cursor c) { 
     super(context, R.layout.row, c, FROM, TO); 
    } 
    @Override 
    public void bindView(View row, Context context, Cursor cursor) { 
     super.bindView(row, context, cursor); 

     long timestamp = cursor.getLong(cursor.getColumnIndex("date")); 
     TextView textDate = (TextView) row.findViewById(R.id.textDate); 
     textDate.setText(DateUtils.getRelativeTimeSpanString(timestamp)); 
     TextView textMsg = (TextView) row.findViewById(R.id.textMsg); 

     String previewMsg = cursor.getString(cursor.getColumnIndex("body")); 
     if (previewMsg.length() > 40) 
     { 
      textMsg.setText(previewMsg.substring(0, 37) + "..."); 
     } 

     TextView textPerson = (TextView) row.findViewById(R.id.textPerson); 
     String contactId = DataManager.getContactId(context, (textPerson.getText()).toString()); 
     if (contactId != "") 
     { 
      contentResolver = context.getContentResolver(); 
      imageAvatar = (ImageView) row.findViewById(R.id.imageAvatar); 
      Long lContactId = Long.parseLong(contactId); 
      Bitmap bitmap = DataManager.getContactPhoto(contentResolver, lContactId); 
      if (bitmap != null) 
      { 
       imageAvatar.setImageBitmap(bitmap); 
       bitmap = null; 
      } 
      String contactName = DataManager.getContactName(context, (textPerson.getText()).toString()); 
      textPerson.setText(contactName); 
     } 
    } 

} 

и есть моя деятельность, которая показывает список:

import android.app.Activity; 
import android.content.ContentResolver; 
import android.content.Context; 
import android.content.Intent; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.ListView; 

public class ConversationsActivity extends Activity { 
    private final String TAG = "ConversationsActivity"; 
    ConversationAdapter adapter; 
    ContentResolver contentResolver; 
    Cursor cursor; 
    ListView convList; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.conversations_list); 
     convList = (ListView) findViewById(R.id.convList); 

    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     setupConvsList(); 
    } 
    void setupConvsList() 
    { 
     Context context = getApplicationContext(); 
     contentResolver = context.getContentResolver(); 
     cursor = contentResolver.query(Uri.parse("content://mms-sms/conversations"), null, null, null, "date DESC"); 
     startManagingCursor(cursor); 

     adapter = new ConversationAdapter(this, cursor); 
     convList.setAdapter(adapter); 
    } 
} 

Что я должен изменить? Спасибо!

ответ

2

Проблема здесь:

if (contactId != "") 
     { 
      contentResolver = context.getContentResolver(); 
      imageAvatar = (ImageView) row.findViewById(R.id.imageAvatar); 
      Long lContactId = Long.parseLong(contactId); 
      Bitmap bitmap = DataManager.getContactPhoto(contentResolver, lContactId); 
      if (bitmap != null) 
      { 
       imageAvatar.setImageBitmap(bitmap); 
       bitmap = null; 
      } 
      String contactName = DataManager.getContactName(context, (textPerson.getText()).toString()); 
      textPerson.setText(contactName); 
     } 

Вы должны сделать else заявление слишком и установить изображение по умолчанию или что-то там .. иначе ваш многоразовые View останется со старым изображением, которое вы установили ранее.

+0

Ах, вы правы. Спасибо :) –

+0

Я испытал то же самое. Если контакт отсутствует, тогда его необходимо установить на изображение по умолчанию. В противном случае он использует изображение переработанного вида. – toobsco42

Смежные вопросы