Проблема с отображением фото в ImageView на разных устройствах
В приложении есть RecyclerView и у каждого элемента есть ImageView. В адаптере я пробовал установить фото 3-мя разными способами: .setImageURI(), Bitmap и при помощи Picasso. Все замечательно работает на Realme 6 Pro(android 10), Samsung Galaxy A3(android 5) и Huawei Note 2(android 8). На Redmi 4X (android 7.1.2), когда я выбираю фото все нормально, но если перезагрузить приложение фото исчезает. Что бы это могло быть? Также перед установкой фото я проверяю права WRITE_EXTERNAL_STORAGE и READ_EXTERNAL_STORAGE.
Код адаптера:
class DiaryListAdapter internal constructor(
context: Context
) : RecyclerView.Adapter<DiaryListAdapter.DiaryViewHolder>() {
private val inflater: LayoutInflater = LayoutInflater.from(context)
private val mContext = context
private var diaries = emptyList<ExtendedDiary>()
private val permissionRequestCode = 11
private val permissionsList = arrayOf(
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
)
class DiaryItemDiffCallBack(
private var oldDiaryList: List<ExtendedDiary>,
private var newDiaryList: List<ExtendedDiary>
): DiffUtil.Callback() {
override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
return (oldDiaryList[oldItemPosition].diary.id == newDiaryList[newItemPosition].diary.id)
}
override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
return oldDiaryList[oldItemPosition] == newDiaryList[newItemPosition]
}
override fun getOldListSize(): Int {
return oldDiaryList.size
}
override fun getNewListSize(): Int {
return newDiaryList.size
}
}
inner class DiaryViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
private val diaryImageView: ImageView = itemView.findViewById(R.id.imageView)
fun bindView(extDiary: ExtendedDiary) {
// photo
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (checkPermission(mContext, permissionsList)) {
if (extDiary.diary.img != null && extDiary.diary.img != "") {
// trying to set an image with Picasso
Picasso.with(mContext).load(extDiary.diary.img).into(diaryImageView)
// using simple setImageURI
//val uriImage = Uri.parse(extDiary.diary.img)
//diaryImageView.setImageURI(uriImage)
// using Bitmap
//val bitmap: Bitmap
//if (Build.VERSION.SDK_INT >= 28) {
// val source: ImageDecoder.Source = ImageDecoder.createSource(
// mContext.getApplicationContext().getContentResolver(),
// uriImage
// )
// try {
// bitmap = ImageDecoder.decodeBitmap(source)
// diaryImageView.setImageBitmap(bitmap)
// } catch (e: IOException) {
// e.printStackTrace()
// }
//} else {
// try {
// bitmap = MediaStore.Images.Media.getBitmap(
// mContext.getApplicationContext()
// .getContentResolver(), uriImage
// )
// diaryImageView.setImageBitmap(bitmap)
// } catch (e: IOException) {
// e.printStackTrace()
// }
//}
} else
diaryImageView.setImageResource(R.drawable.logo)
} else {
requestPermissions(mContext as Activity, permissionsList, permissionRequestCode)
}
} else {
if (extDiary.diary.img != null && extDiary.diary.img != "") {
Picasso.with(mContext).load(extDiary.diary.img).into(diaryImageView)
}
else
diaryImageView.setImageResource(R.drawable.logo)
}
}
}
private fun checkPermission(context: Context, permissions: Array<String>) : Boolean {
var allSuccess = true
for(i in permissions.indices) {
if(checkCallingOrSelfPermission(context, permissions[i]) == PermissionChecker.PERMISSION_DENIED) {
allSuccess = false
}
}
return allSuccess
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DiaryViewHolder {
val itemView = inflater.inflate(R.layout.recyclerview_layout, parent, false)
return DiaryViewHolder(itemView)
}
override fun onBindViewHolder(holder: DiaryViewHolder, position: Int) {
holder.bindView(diaries[position])
}
internal fun setDiaries(diaries: List<ExtendedDiary>) {
val oldList = this.diaries
val diffResult : DiffUtil.DiffResult = DiffUtil.calculateDiff(
DiaryItemDiffCallBack(oldList, diaries)
)
this.diaries = diaries
diffResult.dispatchUpdatesTo(this)
}
override fun getItemCount() = diaries.size
}
ExtendedDiary содержит Diary который содержит поле String под названием 'img'.