从数据库中的位图在 GridView 中平滑滚动



我在数据库中有一些图像,我想用GridView显示它们。

这是我从数据库中获取Bitmaps的函数

public Bitmap getBitmaps(String tableName, int id, int index) {
        String selectQuery = "SELECT  * FROM " + tableName + " WHERE "
                + BaseColumns._ID + " = " + id;
        Cursor cursor = mDatabase.rawQuery(selectQuery, null);
        cursor.moveToFirst();
        byte[] byteArray = cursor.getBlob(index);
        return BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
    }

这是我GridView的适配器

public View getView(final int position, View convertView,
                ViewGroup parent) {
            final ViewHolder viewHolder;
            if (convertView == null) {
                //..
            } else {
            //..
            }
            new AsyncTask<ViewHolder, Void, Bitmap>() {
                private ViewHolder v;
                @Override
                protected Bitmap doInBackground(ViewHolder... params) {
                    v = params[0];    
                    return getBitmaps(tableName, id,index);
                }
                @Override
                protected void onPostExecute(Bitmap result) {
                    super.onPostExecute(result);
                    if (v.position == position) {
                        v.image.setImageBitmap(result);
                    }
                }
            }.execute(viewHolder);
            return convertView;
        }

现在我有一个问题:

例如,我的GridView中有 20 多个项目。当我向下滚动到列表的末尾时,需要 1 或 2 秒(如果列表变大,则需要更多秒)来加载某个位置的图像。如果我滚动到列表顶部,会出现同样的问题。

现在如何优化我的代码以平滑快速地滚动?

您必须更改方法,例如创建一个 ImageLoader 类并将您的请求传递给它。 在图像加载器中创建一个内存缓存 LRUCache 然后,如果请求在缓存中,如果它不是从数据库加载的,只需返回它,然后将其设置为 viewholder . 对于每个viewholder设置一个等于其位置的标签,然后在加载它时检查标签 viewholder 并查看它是否等于您刚刚加载的图像位置,如果相等,则设置图像,否则表示视图持有人已被回收。将引用保留viewholder weakreference,并在图像准备就绪时检查支架以查看它是否为空。

还可以进一步优化,例如回收bitmap,您可以阅读文档以了解它是如何实现的。

快乐编码:-)

最新更新