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)