如何只呈现listview的可见项

  • 本文关键字:listview android listview
  • 更新时间 :
  • 英文 :


在我的理解ListView只加载和呈现可见的项目,但在我的情况下,它似乎总是呈现所有的项目。因此,它需要5秒(约150个条目),直到ListView变得可见。

Logcat显示:

I/OpenGLRenderer: Davey! duration=4740ms; 

如果我不加载图像,它需要~1秒。从我的角度来看,也要慢得多。

限制为5个条目,列表出现得很快…

下面是我使用的简化代码:

listView = (ListView) view.findViewById(R.id.contact_list);
listView.setAdapter(new ContactAdapter(context, contacts));

ContactAdapter(Context context, List<Contact> contacts) {
this.contactList = contacts;
this.mInflater = LayoutInflater.from(context);
this.context = context;
}
public View getView(final int position, View convertView, final ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.contact_with_pic_ex, null);
holder = new ViewHolder();
holder.imgPicture = (ImageView) convertView.findViewById(R.id.picture);
holder.txtName = (TextView) convertView.findViewById(R.id.name);
holder.txtDate = (TextView) convertView.findViewById(R.id.date);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
final Contact contact = contactList.get(position);
holder.imgPicture.setImageBitmap(getPhotoAsBitmap(contact.getID()));
holder.txtName.setText(contact.getName());
holder.txtDate.setText(contact.getDate());

return convertView;
}
private Bitmap getPhotoAsBitmap(final int ID) {
Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, ID);
InputStream is = ContactsContract.Contacts.openContactPhotoInputStream(context.getContentResolver(), uri, true);
Bitmap bitmap;
if (is == null)
bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.contour_dark);
else {
bitmap = BitmapFactory.decodeStream(input);
}
return bitmap;
}

不管我用的是缩略图还是雇工图,花的时间都是一样的。

你能帮我使代码更快吗?

由于BitmapFactory.decodeStream这个指令很慢,你必须在渲染之前在后台线程中做处理。

可以是这样的:

private static class ContactLoader extends AsyncTask<Void, Void, List<Contact>> {

private final Context context;

public ContactLoader(Context context) {
this.context = context;
}
@Override
protected List<Contact> doInBackground(Void... voids) {
List<Contact> contacts = getContactListSomeWhere();
for(Contact contact : contacts) {
contact.setImageBitmap(getPhotoAsBitmap(contact.getID()))
}
return contacts;
}
@Override
protected void onPostExecute(List<Contact> contacts) {
super.onPostExecute(contacts);
// Render data to ListView
}
private Bitmap getPhotoAsBitmap(final int ID) {
Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, ID);
InputStream is = ContactsContract.Contacts.openContactPhotoInputStream(context.getContentResolver(), uri, true);
Bitmap bitmap;
if (is == null)
bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.contour_dark);
else {
bitmap = BitmapFactory.decodeStream(input);
}
return bitmap;
}
}

相关内容

  • 没有找到相关文章