我想在ListView中显示联系人的照片。当有大量联系人时,我正面临性能问题(滚动不顺畅)。我正在使用ArrayAdapter的getView方法将联系人照片分配给ImageView。当不使用图像时,滚动是平滑的。
但默认的联系人应用程序滚动非常顺利。所以我的应用程序存在性能问题。
如何改善表现?请建议。
private class MyArrayListAdapter extends ArrayAdapter<ContactsBook> implements OnItemClickListener{
private ArrayList<ContactsBook> mContacts;
private Context mContext;
public MyArrayListAdapter(Context context, int textViewResourceId, ArrayList<ContactsBook> contacts) {
super(context, textViewResourceId, contacts);
mContacts= contacts;
mContext=context;
}
@Override
public View getView(int position, View converview, ViewGroup parent){
View view=converview;
ViewHolder viewHolder=new ViewHolder();
if(view==null){
LayoutInflater inflater=(LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view=inflater.inflate(R.layout.phone_row, null);
viewHolder.tvName=(TextView)view.findViewById(R.id.tvContact);
viewHolder.tvPhoneNo=(TextView)view.findViewById(R.id.tvPhoneNo);
viewHolder.qcBadge=(QuickContactBadge)view.findViewById(R.id.qContact);
view.setTag(viewHolder);
}
else
viewHolder=(ViewHolder) view.getTag();
ContactsBook cb=mContacts.get(position);
if(cb!=null){
Uri contactPhotoUri = ContentUris.withAppendedId(Contacts.CONTENT_URI,cb.getContactIndex());
BitmapDownloaderTask bdTask=new BitmapDownloaderTask(viewHolder.qcBadge);
bdTask.execute(contactPhotoUri.toString());
viewHolder.qcBadge.assignContactUri(contactPhotoUri);
viewHolder.qcBadge.setImageBitmap(framePhoto(BitmapFactory.decodeResource(getResources(), R.drawable.ic_contact_list_picture)));
viewHolder.tvName.setText(getContactDisplayName(cb.getContactIndex()));
viewHolder.tvPhoneNo.setText(getContactPhoneNo(cb.getContactIndex()));
}
return view;
}
class BitmapDownloaderTask extends AsyncTask<String, Void, Bitmap> {
private String url;
private final WeakReference<ImageView> imageViewReference;
public BitmapDownloaderTask(ImageView imageView) {
imageViewReference = new WeakReference<ImageView>(imageView);
}
/**
* Actual download method.
*/
@Override
protected Bitmap doInBackground(String... params) {
url = params[0];
Uri conUri=Uri.parse(url);
InputStream photoInputStream=Contacts.openContactPhotoInputStream(mContext.getContentResolver(), conUri);
if(photoInputStream==null)
return framePhoto(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.ic_contact_list_picture));
Bitmap photo=framePhoto(getPhoto(mContext.getContentResolver(), conUri));
return photo;
}
/**
* Once the image is downloaded, associates it to the imageView
*/
@Override
protected void onPostExecute(Bitmap bitmap) {
if (isCancelled()) {
bitmap = null;
}
if (imageViewReference != null) {
ImageView imageView = imageViewReference.get();
imageView.setImageBitmap(bitmap);
}
}
}
答案 0 :(得分:6)
在getView()
中创建视图时,您应该放置一个通用图标代替照片,然后启动AsyncTask以在后台加载图像并尽快从getView()
返回。然后,当图像准备就绪(完成AsyncTask后台任务)时,用加载的图像替换视图中的通用图标。
这样图像可能不会立即显示,但滚动会很流畅。