我看到下面的屏幕,其中包含一些图像(每个可见页面 6 个图像)。对我来说,上下滚动似乎很滞后。就像它再次渲染图像一样。向上滚动似乎比向下滚动更糟糕。
有人知道如何提高此类区域的性能以创建漂亮的平滑滚动吗?
Update:图像和文本都是从我的 SQLite 数据库中检索的。该列表是使用 SimpleCursorAdapter 创建的。
private class HistoryViewBinder implements SimpleCursorAdapter.ViewBinder
{
//private int wallpaperNumberIndex;
private int timeIndex;
private int categoryIndex;
private int imageIndex;
private java.text.DateFormat dateFormat;
private java.text.DateFormat timeFormat;
private Date d = new Date();
public HistoryViewBinder(Context context, Cursor cursor)
{
dateFormat = android.text.format.DateFormat.getDateFormat(context);
timeFormat = android.text.format.DateFormat.getTimeFormat(context);
//wallpaperNumberIndex = cursor.getColumnIndexOrThrow(HistoryDatabase.KEY_WALLPAPER_NUMBER);
timeIndex = cursor.getColumnIndexOrThrow(HistoryDatabase.KEY_TIME);
categoryIndex = cursor.getColumnIndexOrThrow(HistoryDatabase.KEY_CATEGORY);
imageIndex = cursor.getColumnIndexOrThrow(HistoryDatabase.KEY_IMAGE);
}
@Override
public boolean setViewValue(View view, Cursor cursor, int columnIndex)
{
Log.d(TAG, "setViewValue");
if (view instanceof TextView)
{
Log.d(TAG, "TextView");
TextView tv = (TextView) view;
if (columnIndex == timeIndex)
{
Log.d(TAG, "timeIndex");
d.setTime(cursor.getLong(columnIndex));
tv.setText(timeFormat.format(d) + " " + dateFormat.format(d));
return true;
}
else if (columnIndex == categoryIndex)
{
Log.d(TAG, "categoryIndex");
tv.setText(cursor.getString(columnIndex));
return true;
}
}
else if (view instanceof ImageView)
{
Log.d(TAG, "ImageView");
ImageView iv = (ImageView) view;
if (columnIndex == imageIndex)
{
Log.d(TAG, "imageIndex");
byte[] image = cursor.getBlob(columnIndex);
Bitmap bitmapImage = BitmapFactory.decodeByteArray(image, 0, image.length);
iv.setImageBitmap(bitmapImage);
return true;
}
}
return false;
}
}
问题是每个图像在视图准备显示时就被解码。 ListView 将回收您的视图,这意味着视图离开屏幕时它将被重用,因此图像将被覆盖并被垃圾收集。如果该项目重新进入屏幕,则必须再次从数据库中对图像进行解码。
解码速度相当快,但如果用户非常快地更改列表中的位置,所有解码调用都会使您的列表非常滞后。
我会实现类似图像缓存的东西。一个持有 Map 的类弱引用 http://developer.android.com/reference/java/lang/ref/WeakReference.html到图像。每次您想要显示图像时,您都会查看该图像是否已在地图中准备好,以及 WeakReference 是否仍然指向一个对象,如果不是这种情况,您需要解码图像,然后将其存储在地图中。
看一下延迟加载问题,这些问题将向您展示如何将解码置于后台任务中,然后在加载图像时更新列表。虽然需要付出更多的努力,但可以使列表变得更快。如果您要使用延迟加载问题中的代码示例,请尝试使用异步任务 http://developer.android.com/reference/android/os/AsyncTask.html而不是线程来进行解码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)