recyclerView 裡面。麻煩的部分可能是接取圖片以及將它們放入 recyclerView,這邊要寫一個 data-class ,為得是將文字以及圖片都能夠一併回傳給 list 的 fragment。存取系統的相簿
這邊要記得加入 EXTRA_ALLOW_MULTIPLE 這個屬性,才有辦法選取系統的多張照片,否則只能夠選擇一張
private fun choosePhotoEvent(){
val intentAlbum = Intent(Intent.ACTION_PICK)
intentAlbum.type = "image/*"
intentAlbum.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
startActivityForResult(intentAlbum,ALBUM_CODE)
}
接收被選取的照片
這邊要在 onActivityResult 裡面接收,這邊會接收上個 Activity 結束之後,回傳回來的資料。因為選擇本地相簿會跳到一個 Activity 去,當使用者結束之後會再回來,進入這個 onActivityResult 。
裡面的 ALBUM_CODE 是一個參數,透過這個參數能夠去確認是否是來自相簿 Activity 的,而透過 data?.clipData?.getItemAt(i)?.uri 能夠得到使用者到底選了哪幾張圖片。
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when(requestCode) {
ALBUM_CODE -> {
if (resultCode == Activity.RESULT_OK && data != null) {
val args = Bundle()
for(i in 0..(data.clipData!!.itemCount-1)){
noteList.add(Holder.Datas(data?.clipData?.getItemAt(i)?.uri, "hi"))
}
args.putParcelableArrayList(NEW_IMG ,ArrayList<Holder.Datas>(noteList))
val todoList = fragmentManager!!.findFragmentByTag("todoList")
todoList!!.arguments = args
fragmentManager?.popBackStack()
}
}
}
}
塞回 recyclerView 裡面
我這邊是先把他們包成一個 ArrayList 回傳回去,再去取 ArrayList 裡面的每個 data-class,放入 recyclerView。透過 putParcelableArrayList<Holder.Datas> 放入 bundle 的方法,將資料塞入 fragment 裡面去。
怎麼讓使用者一次選取多張圖片?
如上面所說的,加入EXTRA_ALLOW_MULTIPLE 這個屬性即可。
為何圖片的載入那麼花時間?
因為原圖可能解析度很高,而這樣的圖片大小也會顯得相當的大,會導致整個 app 的負載量很高。這時使用 google 提出的 Glide,他是去模仿照片用畫的畫出圖來,可以用來解決把整張原圖載入的瓶頸。使用方法如下
// localPhoto: ImageView
// newList.imgURL: URL
Glide.with(view).load(newList.imgURL).into(localPhoto)