Android 无法将缩略图加载到ListView中
我目前正在尝试制作一个简单的图像库,就像现在已经弃用的AndroidAndroid 无法将缩略图加载到ListView中,android,listview,gallery,Android,Listview,Gallery,我目前正在尝试制作一个简单的图像库,就像现在已经弃用的Android库。从这个图库中,用户还可以通过从图库中选择一个图像来导航到一个简单的图像编辑器。经过大量的谷歌搜索,我终于找到了一个horizontalistView,这正是我所需要的。最初,我在这方面取得了很大成功,只需将图像作为压缩位图插入到我的文件夹中。但从那时起,我发现他们创建了一个图像库和一个图像编辑器;与我试图创建的内容类似。然而,我的应用程序和他们的应用程序之间有两个主要区别: 他们在图库中使用GridView,我使用前面提到
库
。从这个图库中,用户还可以通过从图库中选择一个图像来导航到一个简单的图像编辑器。经过大量的谷歌搜索,我终于找到了一个horizontalistView
,这正是我所需要的。最初,我在这方面取得了很大成功,只需将图像作为压缩位图插入到我的文件夹中。但从那时起,我发现他们创建了一个图像库和一个图像编辑器;与我试图创建的内容类似。然而,我的应用程序和他们的应用程序之间有两个主要区别:
- 他们在图库中使用
,我使用前面提到的GridView
HorizontalListView
- 我试图仅从指定的目标路径加载图像,而不是仅加载SD卡上的所有图像
private class ThumbnailAsyncTask extends AsyncTask<Long, Void, Bitmap>
{
//The ImageView we will be adding the thumbnail to
private final ImageView mTarget;
public ThumbnailAsyncTask(ImageView target)
{
mTarget = target;
}
@Override
protected Bitmap doInBackground(Long... params)
{
final long photoID = params[0];
final Bitmap result = MediaStore.Images.Thumbnails.getThumbnail(
getContentResolver(), photoID, MediaStore.Images.Thumbnails.MINI_KIND, null);
return result;
}
@Override
protected void onPreExecute()
{
mTarget.setTag(this);
}
@Override
protected void onPostExecute(Bitmap result)
{
if (mTarget.getTag() == this)
{
mTarget.setImageBitmap(result);
mTarget.setTag(null);
}
}
}
使用以下游标装入器
final LoaderCallbacks<Cursor> mCursorCallbacks = new LoaderCallbacks<Cursor>()
{
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args)
{
final String[] columns = {BaseColumns._ID};
return new CursorLoader(NewProjectActivity.this,
Uri.fromFile(new File(mTargetPath)), columns, null, null,
MediaStore.Images.Media.DATE_ADDED + " DESC");
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data)
{
mAdapter.swapCursor(data);
}
@Override
public void onLoaderReset(Loader<Cursor> loader)
{
mAdapter.swapCursor(null);
}
};
getLoaderManager().initLoader(LOADER_CURSOR, null, mCursorCallbacks);
final loader callbacks mCursorCallbacks=new loader callbacks()
{
@凌驾
公共加载器onCreateLoader(int-id,Bundle-args)
{
最终字符串[]列={BaseColumns.\u ID};
返回新的游标装入器(NewProjectActivity.this,
Uri.fromFile(新文件(mTargetPath)),列,null,null,
MediaStore.Images.Media.DATE_已添加+“DESC”);
}
@凌驾
public void onLoadFinished(加载器、光标数据)
{
mAdapter.swapCursor(数据);
}
@凌驾
公共void onLoaderReset(加载器)
{
mAdapter.swapCursor(空);
}
};
getLoaderManager().initLoader(LOADER_CURSOR,null,mCursorCallbacks);
关于为什么没有加载我的图像有什么想法吗?这里的基本问题是,
bindView()
方法没有等待asynctask的结果。当列表视图的某些内容发生更改时,您需要通知列表视图
您可以执行以下更改
1) 更改task.execute(photoId)
totask.execute(photoId.get()
这将强制您的bindView()
方法等待,直到您获得图像。这种方法是不可取的,但它将帮助您了解确切的问题
或
2) 在asynctask
的onPost()
mAdapter.notifyDataSetChanged();
mAdapter.notifyDataSetInvalidated();
或
3) 就个人而言,我建议您首先通过更改代码结构完成所有网络操作(即获取图像),然后尝试使用预取数据设置适配器。这不是一个完美的解决方案,但它在我的情况下起了作用 我尝试了你的第一个建议,但没有成功,那么我该如何实施你的第二个建议呢?我是否只需调用notifyDataSetChanged()
?我很抱歉,因为我有点像一个Android新手。我只是按照你的建议重新组织了我的代码,最终让它工作了。谢谢:)
mAdapter.notifyDataSetChanged();
mAdapter.notifyDataSetInvalidated();