Ken*_*ngs 5 android listview gallery
我目前正在尝试创建一个简单的图片库,就像现在已弃用的Android一样Gallery.从该库中,用户还可以通过从库中选择图像来导航到简单的图像编辑器.很多谷歌搜索后,我设法找到了HorizontalListView 这里,这正是我需要的.最初我通过将图像作为压缩位图插入到我的文件夹中而获得了很多成功.从那以后,我从谷歌I/O中找到了这个视频,他们创建了一个图像库和一个图像编辑器; 类似于我试图创造的东西.然而,我的应用程序和他们的应用程序有两个主要区别:
GridView为他们的画廊,我使用前面提到的HorizontalListView到目前为止,我无法使他们的代码适应我的,因为没有任何图像加载到我的画廊.与视频一样,我使用AsyncTask来加载我的缩略图:
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用CursorAdapter为图库中的图像:
private class PhotoAdapter extends CursorAdapter
{
public PhotoAdapter(Context context)
{
super(context, null, false);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent)
{
return LayoutInflater.from(context).inflate(R.layout.list_item, parent, false);
}
@Override
public void bindView(View view, Context context, Cursor cursor)
{
final long photoId = cursor.getLong(cursor.getColumnIndex(BaseColumns._ID));
final ImageView imageView = (ImageView) view.findViewById(android.R.id.icon);
/*
* Cancel any pending thumbnail task, since this view is now bound
* to new thumbnail
*/
final ThumbnailAsyncTask oldTask = (ThumbnailAsyncTask) imageView.getTag();
if (oldTask != null)
oldTask.cancel(false);
/*
* If we arrived here, either cache is disabled or cache miss, so we
* need to kick task to load manually
*/
final ThumbnailAsyncTask task = new ThumbnailAsyncTask(imageView);
imageView.setImageBitmap(null);
imageView.setTag(task);
task.execute(photoId);
}
}
Run Code Online (Sandbox Code Playgroud)
使用以下CursorLoader
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);
Run Code Online (Sandbox Code Playgroud)
关于为什么我的图像都没有加载的任何想法?
这里的基本问题是,bindView()方法不等待 asynctask 的结果。当列表视图的某些内容发生更改时,您需要通知列表视图。
您可以进行以下更改。
1)task.execute(photoId);对此进行更改task.execute(photoId).get();将迫使您的bindView()方法等待,直到获得图像。这种方法并不可取,但它会帮助您理解确切的问题。
或者
2) 在onPost()of中asynctask,使列表视图的旧内容无效并尝试使用新内容重新加载。
mAdapter.notifyDataSetChanged();
mAdapter.notifyDataSetInvalidated();
Run Code Online (Sandbox Code Playgroud)
或者
3)我个人建议您首先通过更改代码结构来完成所有网络操作(即获取图像),然后尝试使用预取数据设置适配器。这不是一个完美的解决方案,但它适用于我的情况。
| 归档时间: |
|
| 查看次数: |
881 次 |
| 最近记录: |