Picasso carga de imagen generada dentro de AsyncTask
Así que estoy tratando de usar elBiblioteca picasso para descarga de imágenes y caché. Para que el contactUri pase aPicasso
Necesito hacer una consulta a los contactos.Content Provider
. Como no quiero bloquear el hilo principal de la interfaz de usuario para obtener el ID de contacto, lo he puesto en unAsyncTask
. Y una vez que tengo ese contactId, hago la llamada aPicasso
en elonPostExecute()
método de laAsyncTask
.
Sin embargo, estoy notando un parpadeo que aparece cuando me desplazo por miListView
con rapidez. Me parece que hay un problema con elViewHolder
ya que las vistas recicladas muestran la imagen anterior antes de configurar la imagen apropiada. ¿Hay alguna manera de evitar esto?
public class ConversationThreadsCursorAdapter extends SimpleCursorAdapter {
// region Constants
private static final int RECIPIENT_IDS_COLUMN_INDEX = 3;
private static final int ID2_COLUMN_INDEX = 0;
private static final int ADDRESS_COLUMN_INDEX = 1;
// endregion
// region Variables
private final String DEBUG_TAG = getClass().getSimpleName().toString();
private Context mContext;
protected Drawable mDefaultPicDrawable;
protected ContentResolver mContentResolver;
protected LinearLayout.LayoutParams mContactPicLayoutParams;
// endregion
// region Constructors
public ConversationThreadsCursorAdapter(Context context, int layout,
Cursor c, String[] from, int[] to, int flags) {
super(context, layout, c, from, to, flags);
mContext = context;
mDefaultPicDrawable = mContext.getResources().getDrawable(
R.drawable.ic_contact_picture);
mContactPicLayoutParams = new LinearLayout.LayoutParams(
mDefaultPicDrawable.getIntrinsicWidth(),
mDefaultPicDrawable.getIntrinsicHeight());
}
// endregion
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
if (convertView == null) {
convertView = mLayoutInflater.inflate(R.layout.simple_message, null);
// Creates a ViewHolder and store references to the children
// views we want to bind data to.
viewHolder = setupViewHolder(convertView);
convertView.setTag(viewHolder);
} else {
// Get the ViewHolder back to get fast access to the TextView
// and the ImageView.
viewHolder = (ViewHolder) convertView.getTag();
viewHolder.task.cancel(true);
}
mCursor = getCursor();
mCursor.moveToPosition(position);
viewHolder.position = position;
String recipient_ids = mCursor.getString(RECIPIENT_IDS_COLUMN_INDEX);
String[] recipients = recipient_ids.split(" ");
viewHolder.task = new AddressFetcherTask(viewHolder, position);
viewHolder.task.execute(recipients);
return convertView;
}
// region Helper Methods
private ViewHolder bindUIElements(View convertView) {
ViewHolder viewHolder = new ViewHolder();
viewHolder.contactBadge = (QuickContactBadge) convertView.findViewById(R.id.contact_pic);
return viewHolder;
}
private ViewHolder setupViewHolder(View convertView) {
ViewHolder viewHolder = bindUIElements(convertView);
viewHolder.contactBadge.setLayoutParams(mContactPicLayoutParams);
return viewHolder;
}
// endregion
// region Inner Classes
private class ViewHolder {
QuickContactBadge contactBadge;
int position;
}
private class AddressFetcherTask extends AsyncTask < String[], Void, Integer > {
private ViewHolder mViewHolder;
private int mPosition;
public AddressFetcherTask(ViewHolder viewHolder, int position) {
mViewHolder = viewHolder;
mPosition = position;
}
@Override
protected Integer doInBackground(String[]...recipients) {
String recipient = recipients[0][0];
Log.d(DEBUG_TAG, "recipient is " + recipient);
Cursor c = mContentResolver.query(
Uri.parse("content://mms-sms/canonical-addresses"), null, "_id = " + recipient, null, null);
String _id = "";
String address = "";
while (c.moveToNext()) {
_id = c.getString(ID2_COLUMN_INDEX);
address = c.getString(ADDRESS_COLUMN_INDEX);
}
c.close();
int contactId;
if (address != null) {
contactId = ContactsUtils.getContactId(mContext, address, "address");
} else {
contactId = Integer.valueOf(address);
}
return contactId;
}
@Override
protected void onPostExecute(Integer contactId) {
if (mViewHolder.position == mPosition) {
Picasso.with(mContext)
.load(getContactUri(contactId))
.placeholder(R.drawable.ic_contact_picture)
.into(mViewHolder.contactBadge);
}
}
}
// endregion
}