您好,登录后才能下订单哦!
这篇文章主要介绍Android Studio中怎么用List Fragments创建相册Gallery,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
AsyncTaskLoaders 以及 Fragments
加载整个图片库到List是一个运算量比较密集,强度很高任务。因此,我们希望利用 Android 提供的AsyncTaskLoader 通过异步加载解决这个问题。在这里,我已经写好了一个自定义AsyncTaskLoader工具类用加载图库中图片的。我把它命名为:PhotoGalleryImageProvider,可以在源码中找到。
Fragments 提供了一种特殊的接口给异步任务的 Loader 以便于自动触发异步加载任务。我们的图库列表在Fragment中看起来如下面的代码:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Create an empty loader and pre-initialize the photo list items as an empty list. Context context = getActivity().getBaseContext(); // Set up empty mAdapter mPhotoListItem = new ArrayList() ; mAdapter = new PhotoAdapter(context, R.layout.photo_item, mPhotoListItem, false); // Prepare the loader. Either re-connect with an existing one, // or start a new one. getLoaderManager().initLoader(0, null, this); }
请注意***的这一行:
getLoaderManager().initLoader(0, null, this);
这一行的作用就是自动启用 AsyncLoader。AsyncLoader的相关代码放在这个Class文件的后面。
/** * Loader Handlers for loading the photos in the background. */ @Override public Loader<List> onCreateLoader(int id, Bundle args) { // This is called when a new Loader needs to be created. This // sample only has one Loader with no arguments, so it is simple. return new PhotoGalleryAsyncLoader(getActivity()); }
每次后台任务成功获取到图库中的图片时,则会回调下面这个函数:
@Override public void onLoadFinished(Loader<List> loader, List data) { // Set the new data in the mAdapter. mPhotoListItem.clear(); for(int i = 0; i < data.size();i++){ PhotoItem item = data.get(i); mPhotoListItem.add(item); } mAdapter.notifyDataSetChanged(); resolveEmptyText(); cancelProgressDialog(); }
其中,PhotoItem(用作给 Adapter 存储数据)的数组包含了指向所有图库中图片的缩略图以及全尺寸图片的URL。一旦获取这些数据,Adapter必定会通过 “notifyDataSetChanged” 回调来通知出去,从而刷新当前的图片列表。
通过游标(cursor)来获取缩略图
之前我提到过,我已经提供了一个工具类可以用游标方便的去获取图库中图片的缩略图,这个工具类叫做“PhotoGalleryImageProvider”。这个类的主要用法如下:
/** * Fetch both full sized images and thumbnails via a single query. * Returns all images not in the Camera Roll. * @param context * @return */ public static List getAlbumThumbnails(Context context){ final String[] projection = {MediaStore.Images.Thumbnails.DATA,MediaStore.Images.Thumbnails.IMAGE_ID}; Cursor thumbnailsCursor = context.getContentResolver().query( MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, projection, // Which columns to return null, // Return all rows null, null); ... return result; }
直接用Android 提供的Cursors 去后台获取图片是比较简单的一种用法。另一种高级的用法则是使用 CursorLoader 来操作Cursor。CursorLoader 内建了一个 AsyncTaskLoader 可以用来自动处理后台的加载进程。由于需要同时渲染获取到图片的缩略图和完整尺寸的图片,所以尽管使用带有CursorLoader的AsyncTask 也可以得到同样的结果,但我还是选择了写一个自定义的Task Loader。
以上是“Android Studio中怎么用List Fragments创建相册Gallery”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。