So I am trying to use the <a
href="http://square.github.io/picasso/">Picasso Library</a> for image
downloading and caching. In order to get the contactUri to pass to
`Picasso` I need to make a query to the Contacts `Content Provider`. Since
I don't want to block the main UI thread to get the contactId, I have put
this in an `AsyncTask`. And once I get that contactId, I make the call to
`Picasso` in the `onPostExecute()` method of the `AsyncTask`.
However, I am noticing a flickering that shows up when I scroll through my
`ListView` quickly. It seems to me that there is an issue with the
`ViewHolder` since the recycled views are displaying the previous image
before setting the appropriate image. Is there anyway to avoid this?
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();
}
mCursor = getCursor();
mCursor.moveToPosition(position);
viewHolder.position = position;
String recipient_ids =
mCursor.getString(RECIPIENT_IDS_COLUMN_INDEX);
String[] recipients = recipient_ids.split(" ");
new AddressFetcherTask(viewHolder).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
}
--
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
---
You received this message because you are subscribed to the Google Groups
"Android Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.