您好,登錄后才能下訂單哦!
這篇文章主要介紹Android Studio中怎么用List Fragments創(chuàng)建相冊Gallery,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
AsyncTaskLoaders 以及 Fragments
加載整個圖片庫到List是一個運算量比較密集,強度很高任務。因此,我們希望利用 Android 提供的AsyncTaskLoader 通過異步加載解決這個問題。在這里,我已經寫好了一個自定義AsyncTaskLoader工具類用加載圖庫中圖片的。我把它命名為:PhotoGalleryImageProvider,可以在源碼中找到。
Fragments 提供了一種特殊的接口給異步任務的 Loader 以便于自動觸發(fā)異步加載任務。我們的圖庫列表在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()); }
每次后臺任務成功獲取到圖庫中的圖片時,則會回調下面這個函數(shù):
@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 存儲數(shù)據(jù))的數(shù)組包含了指向所有圖庫中圖片的縮略圖以及全尺寸圖片的URL。一旦獲取這些數(shù)據(jù),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創(chuàng)建相冊Gallery”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業(yè)資訊頻道!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。