Я работаю над приложением, в котором у меня есть 2 фрагмента в viewpager. Во втором фрагменте я использую recyclerview, где загружаю в него изображения. Проблемы, с которыми я столкнулся, связаны с блокировкой пользовательского интерфейса. когда я запускаю приложение из Android Studio, а затем выбираю вкладку просмотра 2. оно мгновенно отображает данные, не тратя времени, вы можете сказать максимум от 4 до 5 миллисекунд. Но когда я закрываю приложение самостоятельно, затем открываю его и открываю вкладку просмотра 2, он удерживает/блокирует пользовательский интерфейс до тех пор, пока все представления не будут привязаны.
Я использую Glide для отображения изображений. Я пробовал много модификаций, но лучшего результата не добился. вот мой код.
class MyVideoAdp(
private val context: Context,
val callback: (Int) -> Unit
) :
RecyclerView.Adapter() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyVideoVH {
val binding = VideosItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return MyVideoVH(binding)
}
override fun getItemCount(): Int {
return mDiffer.currentList.size
}
override fun onBindViewHolder(holder: MyVideoVH, position: Int) {
val item = mDiffer.currentList[position]
holder.bind(item)
}
inner class MyVideoVH(private val binding: VideosItemBinding) :
RecyclerView.ViewHolder(binding.root) {
fun bind(item: VideoModel) {
GlideApp.with(context)
.load(item.filePath)
.encodeFormat(Bitmap.CompressFormat.JPEG)
.encodeQuality(10)
.thumbnail(0.1f) // Reduce thumbnail size to load faster
.override(binding.videoThumbnail.width / 2, binding.videoThumbnail.height / 2) // Load a smaller size
.diskCacheStrategy(DiskCacheStrategy.RESOURCE) // Cache the final image
.placeholder(drawable.placeholder_ic)
.dontAnimate() // Disable animations to make loading faster
.into(binding.videoThumbnail)
binding.videoTitle.text = item.fileName // Use the correct property for video title
binding.videoDuration.text =
Utils.formatDuration(item.duration) // Helper method to format duration
binding.videoTimeStamp.text =
item.creationDate // Use a date formatter if needed
Log.d(TAG, "onViewCreated: 5 ${System.currentTimeMillis()}")
}
}
object DiffUtilCallback : DiffUtil.ItemCallback() {
override fun areItemsTheSame(oldItem: VideoModel, newItem: VideoModel): Boolean {
return oldItem.id == newItem.id
}
override fun areContentsTheSame(oldItem: VideoModel, newItem: VideoModel): Boolean {
return oldItem == newItem
}
}
private val mDiffer = AsyncListDiffer(this, DiffUtilCallback)
fun submitList(list: MutableList) {
mDiffer.submitList(list)
}
}
@AndroidEntryPoint
class MyVideosFragment : Fragment() {
private var _binding: FragmentMyVideosBinding? = null
private val binding get() = _binding!!
private val viewModel by activityViewModels()
private var adp: MyVideoAdp? = null
@Inject
lateinit var glide: RequestManager
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
// Inflate the layout for this fragment
_binding = FragmentMyVideosBinding.inflate(layoutInflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
lifecycleScope.launch {
setAdp()
setObserver()
}
}
private fun setObserver() {
Log.d(TAG, "onViewCreated: 3 ${System.currentTimeMillis()}")
viewModel.getAllVideoFiles().observe(viewLifecycleOwner) {
Log.d(TAG, "onViewCreated: 4 ${System.currentTimeMillis()}")
adp?.submitList(it.toMutableList())
}
}
private fun setAdp() {
Log.d(TAG, "onViewCreated: 1 ${System.currentTimeMillis()}")
adp = MyVideoAdp(requireContext()) {
}
binding.myVideosRecycler.setItemAnimator(DefaultItemAnimator())
binding.myVideosRecycler.adapter = adp
Log.d(TAG, "onViewCreated: 2 ${System.currentTimeMillis()}")
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... timization
Оптимизация RecyclerView ⇐ Android
Форум для тех, кто программирует под Android
1728998695
Anonymous
Я работаю над приложением, в котором у меня есть 2 фрагмента в viewpager. Во втором фрагменте я использую recyclerview, где загружаю в него изображения. Проблемы, с которыми я столкнулся, связаны с блокировкой пользовательского интерфейса. когда я запускаю приложение из Android Studio, а затем выбираю вкладку просмотра 2. оно мгновенно отображает данные, не тратя времени, вы можете сказать максимум от 4 до 5 миллисекунд. Но когда я закрываю приложение самостоятельно, затем открываю его и открываю вкладку просмотра 2, он удерживает/блокирует пользовательский интерфейс до тех пор, пока все представления не будут привязаны.
Я использую Glide для отображения изображений. Я пробовал много модификаций, но лучшего результата не добился. вот мой код.
class MyVideoAdp(
private val context: Context,
val callback: (Int) -> Unit
) :
RecyclerView.Adapter() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyVideoVH {
val binding = VideosItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return MyVideoVH(binding)
}
override fun getItemCount(): Int {
return mDiffer.currentList.size
}
override fun onBindViewHolder(holder: MyVideoVH, position: Int) {
val item = mDiffer.currentList[position]
holder.bind(item)
}
inner class MyVideoVH(private val binding: VideosItemBinding) :
RecyclerView.ViewHolder(binding.root) {
fun bind(item: VideoModel) {
GlideApp.with(context)
.load(item.filePath)
.encodeFormat(Bitmap.CompressFormat.JPEG)
.encodeQuality(10)
.thumbnail(0.1f) // Reduce thumbnail size to load faster
.override(binding.videoThumbnail.width / 2, binding.videoThumbnail.height / 2) // Load a smaller size
.diskCacheStrategy(DiskCacheStrategy.RESOURCE) // Cache the final image
.placeholder(drawable.placeholder_ic)
.dontAnimate() // Disable animations to make loading faster
.into(binding.videoThumbnail)
binding.videoTitle.text = item.fileName // Use the correct property for video title
binding.videoDuration.text =
Utils.formatDuration(item.duration) // Helper method to format duration
binding.videoTimeStamp.text =
item.creationDate // Use a date formatter if needed
Log.d(TAG, "onViewCreated: 5 ${System.currentTimeMillis()}")
}
}
object DiffUtilCallback : DiffUtil.ItemCallback() {
override fun areItemsTheSame(oldItem: VideoModel, newItem: VideoModel): Boolean {
return oldItem.id == newItem.id
}
override fun areContentsTheSame(oldItem: VideoModel, newItem: VideoModel): Boolean {
return oldItem == newItem
}
}
private val mDiffer = AsyncListDiffer(this, DiffUtilCallback)
fun submitList(list: MutableList) {
mDiffer.submitList(list)
}
}
@AndroidEntryPoint
class MyVideosFragment : Fragment() {
private var _binding: FragmentMyVideosBinding? = null
private val binding get() = _binding!!
private val viewModel by activityViewModels()
private var adp: MyVideoAdp? = null
@Inject
lateinit var glide: RequestManager
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
// Inflate the layout for this fragment
_binding = FragmentMyVideosBinding.inflate(layoutInflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
lifecycleScope.launch {
setAdp()
setObserver()
}
}
private fun setObserver() {
Log.d(TAG, "onViewCreated: 3 ${System.currentTimeMillis()}")
viewModel.getAllVideoFiles().observe(viewLifecycleOwner) {
Log.d(TAG, "onViewCreated: 4 ${System.currentTimeMillis()}")
adp?.submitList(it.toMutableList())
}
}
private fun setAdp() {
Log.d(TAG, "onViewCreated: 1 ${System.currentTimeMillis()}")
adp = MyVideoAdp(requireContext()) {
}
binding.myVideosRecycler.setItemAnimator(DefaultItemAnimator())
binding.myVideosRecycler.adapter = adp
Log.d(TAG, "onViewCreated: 2 ${System.currentTimeMillis()}")
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79084996/recyclerview-optimization[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия