μλ²μ ν°μ μλ μ¬μ§λ€μ λͺ¨λ κ°μ Έμ μ¬μ©μμκ² λ¦¬μ€νΈλ‘ 보μ¬μ€μΌνλ κΈ°λ₯μ λ§λ€κ² λμμ΅λλ€.
μ λ 'νΌλ―Έμ μ μ μ₯μ μ κ·Ό κΆνμ μ£Όκ³ λ―Έλμ΄ μ μ₯μμ λͺ¨λ μ¬μ§λ€μ PATH URI λ₯Ό κ°μ Έμ ArrayList μ λͺ¨λ μΆκ°νμ¬ RecyclerView λ‘ λ³΄μ¬μ£Όλ©΄ λκ² λ€.' λΌκ³ μκ°νμ΅λλ€.
μ λ λ°λ‘ μμ μ λ€μ΄κ°μ΅λλ€.
λ¨Όμ AndroidManifest μ
<uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE" />
μ μ₯μ μ κ·Ό κΆνμ μ£Όμμ΅λλ€.
κ·Έλ¦¬κ³ λͺ¨λ μ¬μ§λ€μ PATH λ₯Ό λ½λ ν¨μλ₯Ό λ§λ€μμ΅λλ€.
@SuppressLint("Recycle")
private fun getAllImages(activity: Activity){
val uri: Uri = android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI
val cursor: Cursor?
val columnIndexData: Int
val albumList = ArrayList<String>()
val projection = arrayOf(MediaStore.MediaColumns.DATA, MediaStore.Images.Media.BUCKET_DISPLAY_NAME)
cursor = activity.contentResolver.query(uri, projection, null, null, null)
columnIndexData = cursor!!.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA)
while (cursor!!.moveToNext()) {
albumList.add(cursor!!.getString(columnIndexData))
}
albumList.reverse()
albumAdapter = AlbumAdapter(context!!, albumList)
albumAdapter.notifyDataSetChanged()
}
λ§μ§λ§μΌλ‘ μ¬μ§μ 보μ¬μ€ RecyclerView μ μ°μΌ item view μ Adapter μ λ§λ€μμ΅λλ€.
import android.content.Context
import android.content.Intent
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import coloring.com.ccb.R
import coloring.com.ccb.ui.palette.AddPaletteColorActivity
import kotlinx.android.synthetic.main.item_photo.view.*
class AlbumAdapter(private val context: Context,
private val albumList: ArrayList<String>) : RecyclerView.Adapter<AlbumAdapter.AlbumViewHolder>() {
override fun onBindViewHolder(holder: AlbumViewHolder, position: Int) {
if (img != null)
holder.itemView.photo.imageURI = Uri.parse(albumList[position])
else
holder.itemView.photo.setImageResource(R.drawable.ic_launcher_background)
holder.itemView.photo.setOnClickListener {
val intent = Intent(context, AddPaletteColorActivity::class.java)
if(img != null) intent.putExtra("path", albumList[position])
else intent.putExtra("path", "noPath")
context.startActivity(intent)
}
}
override fun getItemCount() = albumList.size
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AlbumViewHolder = AlbumViewHolder(parent)
class AlbumViewHolder(parentView : View) : RecyclerView.ViewHolder(
LayoutInflater.from(parentView.context).inflate(R.layout.item_photo, null, false))
}
μ λ μ λ§λ‘ μ μλλ κ²μ΄λΌκ³ μκ°νμ΅λλ€.
κ·Έλ¬λ μ μ κΈ°λλ₯Ό μ Έλ²λ¦¬μ§ μκ³ μ λ§ λλκ²λ μΉλͺ
μ μΈ λ¬Έμ κ° μκΈ°κ³ λ§λλ€.
μ±μ΄ μμ ν μΌμ§κΈ° κΉμ§ 10 μ΄ μ΄μ κ±Έλ¦¬κ³ ,
μ¬μ§ 리μ€νΈλ€μ 보μ¬μ€ λ, μμ² λ§μ΄ ν°μ λ©λͺ¨λ¦¬λ₯Ό λ¨ΉμΌλ©΄μ ν°μ ꡬλμ΄ λ©μΆλ©΄μ μμ§μ΄μ§ μλ κ²μ΄μμ΅λλ€...
ν΄λν°λ κ°λΉλͺ»νλ μΉλͺ μ μΈ μ μ λ―Έμ€λ 무μμ΄μμκΉμ?
μ λ RecylclerView μ ꡬ쑰μ λ¬Έμ κ° μμλκ² μλκΉ μκ°νμ΅λλ€.
RecyclerView κ΄λ ¨ λ¬Έμλ€μ ν΄μνλ©΄μ κΉμ§ μ½μ΄λ³΄μμ§λ§ λ³ μλμ΄ μμμ΅λλ€.
λ€μ μκ°ν΄λ³΄λ, RecyclerView μ item μΌλ‘ μ¬μ§λ€μ΄ μ 보μΈλ€λ κ²μ RecyclerView μ μλͺ»μ΄ μλ κ²μ μκ²λμμ΅λλ€.
μ λ item μ λ¬Έμ κ° μλκ² μλκΉ μΆμΈ‘νμ΅λλ€.
<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/photo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="fitCenter"
android:adjustViewBounds="true" />
μμλ μ¬μ§μ 보μ¬μ£Όλ itemμ xml νμΌ μ
λλ€.
μ λ§λ‘ λ³κ±° μμ΄ ImageView λ§μΌλ‘ μ΄λ£¨μ΄μ Έ μμ΅λλ€.
if (img != null)
holder.itemView.photo.imageURI = Uri.parse(albumList[position])
else
holder.itemView.photo.setImageResource(R.drawable.ic_launcher_background)
μμ μ½λλ item μ μ΄λ―Έμ§λ₯Ό μ€μ νλ μ½λμ
λλ€.
μ¬κΈ°μ img λ μ΄λ―Έμ§μ PATH μ
λλ€. λ§μ½ img κ° null μ΄ μλλ©΄
uri λ₯Ό ν΅ν΄ item μ΄λ―Έμ§λ₯Ό μ€μ ν©λλ€.
else μΌ λλ μμ μ΄λ―Έμ§ 리μμ€λ₯Ό μ€μ ν΄μ€λλ€.
μ λ μ΄ μ½λλ₯Ό
holder.itemView.photo.setImageResource(R.drawable.ic_launcher_background)
λ‘ λ°κΎΈκ³ ν
μ€νΈλ₯Ό ν΄λ³΄μμ΅λλ€.
μ½λμμΌλ‘ 보면 κ·Έλ₯ μμ μ¬μ§λ€λ‘ μ΄λ£¨μ΄μ§ RecyclerView 리μ€νΈκ° λ§λ€μ΄μ§ κ²μ
λλ€.
κ²°κ³Όλ μ±μ΄ 5μ΄μμ μΌμ§κ³ 리μ€νΈλ₯Ό λ³Ό λλ μ±μ΄ μ ꡬλ λλ κ²μ΄μμ΅λλ€!
holder.itemView.photo.imageURI = Uri.parse(albumList[position])
λ¬Έμ μ μ½λλ μμμ μ½λμμ΅λλ€.
uri λ‘λ§ μ΄λ―Έμ§λ₯Ό μ€μ ν΄μλ μλκ³
무μμΈκ°μ μ²λ¦¬κ° νμνλ€λ κ²μ μκ² λμμ΅λλ€.
μ λ ImageView κ° μ΄λ―Έμ§λ₯Ό 보μ¬μ€ λ, Bitmap μ ν΅ν΄μ 보μ¬μ€λ€λ κ²μ λ μ¬λ Έμ΅λλ€.
μ λ μ κ° κ°μ§κ³ μλ μ¬μ§λ€μ νμΌ μ©λμ 보μμ΅λλ€.
νμ§μ΄ μ’μμ κ·Έλ°μ§ 70 MB μ΄μ μ΄μμ΅λλ€.
μ λ μ¬μ§λ€μ μ©λμ λ³΄κ³ νμ νμ΅λλ€.
'μ΄ λ¬Έμ λ ImageView κ° μ¬μ§λ€μ 보μ¬μ€ λ, μ¬μ§λ€μ Bitmap ν¬κΈ°κ° λ무 컀μ λ©λͺ¨λ¦¬λ₯Ό λ§μ΄ λ¨Ήλ κ²μ΄κ΅¬λ.'
μ λ μ¬μ§λ€μ Bitmap ν¬κΈ°λ₯Ό μ΅μ ν μν¬ λ°©λ²μ μ°ΎκΈ°λ‘ νμ΅λλ€.
μ μκ² λ°©λ²μ 2κ°μ§λ‘ λλμμ΅λλ€.
- Glide λ Picaso κ°μ λΌμ΄λΈλ¬λ¦¬λ‘ λΉνΈλ§΅ ν¬κΈ° μ€μ΄κΈ°
- Android λ¬Έμ 보면μ μ§μ λΉνΈλ§΅ ν¬κΈ° μ€μ΄κΈ°
μ λ λΉνΈλ§΅μ μ€μ΄κΈ° μν΄ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ°λ κ²μ λΉν¨μΈμ μ΄λΌκ³ μκ°νμ¬ μ§μ λΉνΈλ§΅ ν¬κΈ°λ₯Ό μ€μ΄κΈ°λ‘ νμμ΅λλ€.
private fun decodeSampledBitmapFromURI(path: String, reqWidth: Int, reqHeight: Int): Bitmap? {
return BitmapFactory.Options().run {
inJustDecodeBounds = true
BitmapFactory.decodeFile(path, this)
inSampleSize = calculateInSampleSize(this, reqWidth, reqHeight)
inJustDecodeBounds = false
BitmapFactory.decodeFile(path, this)
}
}
μ λ μμ μ½λ μ²λΌ μ¬μ§μ PATH URI λ₯Ό BitmapFactory λ₯Ό ν΅ν΄ Bitmap μΌλ‘ λ³νκ³Ό λμμ Bitmap μ ν¬κΈ°λ₯Ό μ΅μ ν μν€λ ν¨μλ₯Ό λ§λ€μμ΅λλ€.
μ΄ μ½λμμ μ΅μ νλ₯Ό λ΄λΉν ν¨μλ calculateInSampleSize μ
λλ€.
μ½λλ μλμ κ°μ΅λλ€.
private fun calculateInSampleSize(options: BitmapFactory.Options, reqWidth: Int, reqHeight: Int): Int {
val (height: Int, width: Int) = options.run { outHeight to outWidth }
var inSampleSize = 1
if (height > reqHeight || width > reqWidth) {
val halfHeight: Int = height / 2
val halfWidth: Int = width / 2
while (halfHeight / inSampleSize >= reqHeight && halfWidth / inSampleSize >= reqWidth) {
inSampleSize *= 2
}
}
return inSampleSize
}
μλ μ½λλ μ μ© μν¨ κ²μ λλ€.
val img = decodeSampledBitmapFromURI(albumList[position], 200, 200)
if (img != null) holder.itemView.photo.setImageBitmap(img)
else holder.itemView.photo.setImageResource(R.drawable.ic_launcher_background)
μ μ©νλ μ λ§ μ λμκ°λλ€!