AndroidStudio中用ListFragments创建相册Gallery

这是关于在Android Studio中通过 fragments 进行相机方面开发的五篇系列文章的第二篇。如果你还没有把我放在 GitHub 上的范例程序克隆下来,那么请先去这里获取***代码。本文主要包含的是 “SimplePhotoGalleryListFragment” 这个 Fragment。

我们提供的服务有:成都网站设计、成都做网站、微信公众号开发、网站优化、网站认证、莲花ssl等。为成百上千企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的莲花网站制作公司

注意:本范例中所涉及的 List Fragment 的用法,可以在 List Fragments 这篇文章中找到详细的讲解。

AsyncTaskLoaders 以及 Fragments

加载整个图片库到List是一个运算量比较密集,强度很高任务。因此,我们希望利用 Android 提供的AsyncTaskLoader 通过异步加载解决这个问题。在这里,我已经写好了一个自定义AsyncTaskLoader工具类用加载图库中图片的。我把它命名为:PhotoGalleryImageProvider,可以在源码中找到。

Fragments 提供了一种特殊的接口给异步任务的 Loader 以便于自动触发异步加载任务。我们的图库列表在Fragment中看起来如下面的代码:

 
 
 
  1. @Override 
  2. public void onCreate(Bundle savedInstanceState) { 
  3.     super.onCreate(savedInstanceState); 
  4.   
  5.     // Create an empty loader and pre-initialize the photo list items as an empty list. 
  6.     Context context = getActivity().getBaseContext(); 
  7.   
  8.     // Set up empty mAdapter 
  9.     mPhotoListItem = new ArrayList() ; 
  10.     mAdapter = new PhotoAdapter(context, 
  11.             R.layout.photo_item, 
  12.             mPhotoListItem, false); 
  13.   
  14.     // Prepare the loader.  Either re-connect with an existing one, 
  15.     // or start a new one. 
  16.     getLoaderManager().initLoader(0, null, this); 

请注意***的这一行:

 
 
 
  1. getLoaderManager().initLoader(0, null, this); 

这一行的作用就是自动启用 AsyncLoader。AsyncLoader的相关代码放在这个Class文件的后面。

 
 
 
  1. /** 
  2.  * Loader Handlers for loading the photos in the background. 
  3.  */ 
  4. @Override 
  5. public Loader onCreateLoader(int id, Bundle args) { 
  6.     // This is called when a new Loader needs to be created.  This 
  7.     // sample only has one Loader with no arguments, so it is simple. 
  8.     return new PhotoGalleryAsyncLoader(getActivity()); 

每次后台任务成功获取到图库中的图片时,则会回调下面这个函数:

 
 
 
  1. @Override 
  2. public void onLoadFinished(Loader loader, List data) { 
  3.     // Set the new data in the mAdapter. 
  4.     mPhotoListItem.clear(); 
  5.   
  6.     for(int i = 0; i < data.size();i++){ 
  7.         PhotoItem item = data.get(i); 
  8.         mPhotoListItem.add(item); 
  9.     } 
  10.   
  11.     mAdapter.notifyDataSetChanged(); 
  12.     resolveEmptyText(); 
  13.     cancelProgressDialog(); 

其中,PhotoItem(用作给 Adapter 存储数据)的数组包含了指向所有图库中图片的缩略图以及全尺寸图片的URL。一旦获取这些数据,Adapter必定会通过 “notifyDataSetChanged” 回调来通知出去,从而刷新当前的图片列表。

通过游标(cursor)来获取缩略图

之前我提到过,我已经提供了一个工具类可以用游标方便的去获取图库中图片的缩略图,这个工具类叫做“PhotoGalleryImageProvider”。这个类的主要用法如下:

 
 
 
  1. /** 
  2.      * Fetch both full sized images and thumbnails via a single query. 
  3.      * Returns all images not in the Camera Roll. 
  4.      * @param context 
  5.      * @return 
  6.      */ 
  7.     public static List getAlbumThumbnails(Context context){ 
  8.   
  9.         final String[] projection = {MediaStore.Images.Thumbnails.DATA,MediaStore.Images.Thumbnails.IMAGE_ID}; 
  10.   
  11.         Cursor thumbnailsCursor = context.getContentResolver().query( MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, 
  12.                 projection, // Which columns to return 
  13.                 null,       // Return all rows 
  14.                 null, 
  15.                 null); 
  16.         ... 
  17.   
  18.         return result; 
  19.     } 

直接用Android 提供的Cursors 去后台获取图片是比较简单的一种用法。另一种高级的用法则是使用 CursorLoader 来操作Cursor。CursorLoader 内建了一个 AsyncTaskLoader 可以用来自动处理后台的加载进程。由于需要同时渲染获取到图片的缩略图和完整尺寸的图片,所以尽管使用带有CursorLoader的AsyncTask 也可以得到同样的结果,但我还是选择了写一个自定义的Task Loader。

除了这些必须了解的内容,你现在可以获取范例代码然后好好享受学习的旅程了!

相关连接

  • List all camera images (用作分部创建cursor loader类)

原文链接:airpair   翻译:zerob13

译文链接:http://blog.jobbole.com/73138/

文章题目:AndroidStudio中用ListFragments创建相册Gallery
本文网址:http://www.gawzjz.com/qtweb/news29/193729.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联