ViewPager2 中未显示图像(片段重新打开时)
Posted
技术标签:
【中文标题】ViewPager2 中未显示图像(片段重新打开时)【英文标题】:Image not shown in ViewPager2 (when Fragment reopened) 【发布时间】:2021-09-24 04:46:08 【问题描述】:我在我的 android 应用程序的 Fragment 中实现了 ViewPager2,它将使用 Uri 加载的图像显示到 ImageView
(幻灯片库)中。一切正常,但是,当我关闭并重新打开片段时,图像不会被加载。只有当我开始滑动 ViewPager2 时,图像才会再次加载到 ViewPager2 中。奇怪的是,此错误仅发生在较旧的 Android 版本上(已在 Android 6 上测试过),但不会出现在较新的版本(Android 10)上。我认为它可能与 Fragment(缓存或其他东西)有关,因为如果我在 Activity 中实现相同的代码,关闭并重新打开它,则不会发生错误。
知道如何解决此问题,以便始终将图像加载到 Fragment 中的 ViewPager2 中吗?
在Fragment
中实现ViewPager2
的代码:
val media= utilities.getMedia(this)
val mediaList = media.toMutableList()
val adapter = ViewPagerAdapter(mediaList)
photo_view_pager.adapter = adapter
ViewPagerAdapter:
class ViewPagerAdapter (
private val images: List<Media>
) : RecyclerView.Adapter<ViewPagerAdapter.ViewPagerViewHolder>()
inner class ViewPagerViewHolder(itemView: View): RecyclerView.ViewHolder(itemView)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewPagerViewHolder
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_picture, parent, false)
return ViewPagerViewHolder(view)
override fun getItemCount(): Int
return images.size
override fun onBindViewHolder(holder: ViewPagerViewHolder, position: Int)
val curImageUri = images[position].uri
val thumbnail = holder.itemView.image_preview
thumbnail.post
Glide.with(thumbnail)
.load(curImageUri)
.into(thumbnail)
提前感谢您的帮助!
【问题讨论】:
【参考方案1】:请尝试以下带图片的viewpager方式
<androidx.viewpager.widget.ViewPager
android:id="@+id/viewPager"
android:layout_
android:layout_>
class MyFragment : Fragment
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View?
return super.onCreateView(inflater, container, savedInstanceState)
initPager()
var pagerAdapter: PagerAdapter? = null
fun initPager()
pagerAdapter = PagerAdapter(activity,mlist)
viewPager.adapter = pagerAdapter
viewPager.offscreenPageLimit = mlist.size
viewPager.addOnPageChangeListener(object :
ViewPager.OnPageChangeListener
override fun onPageScrolled(
position: Int,
positionOffset: Float,
positionOffsetPixels: Int
)
override fun onPageSelected(position: Int)
override fun onPageScrollStateChanged(state: Int)
)
class PagerAdapter(manager: FragmentManager) : PagerAdapter(manager)
private val mlist: ArrayList<Int>? = null
private val inflater: LayoutInflater? = null
private val context: Context? = null
override fun destroyItem(container: ViewGroup, position: Int, `object`: Any)
container.removeView(`object` as View)
override fun getCount(): Int
return mlist.size()
override fun restoreState(state: Parcelable?, loader: ClassLoader?)
override fun saveState(): Parcelable?
return null
override fun isViewFromObject(view: View, `object`: Any): Boolean
return view.equals(`object`)
override fun getPageTitle(position: Int): CharSequence?
return mFragmentTitleList[position]
override fun instantiateItem(view: ViewGroup, position: Int): Any
val imageLayout: View = inflater.inflate(R.layout.layout_image, view, false)!!
thumbnail.post
Glide.with(imageLayout.context)
.load(mlist.get(position).imageurl)
.into(imageView)
view.addView(imageLayout, 0)
return imageLayout
【讨论】:
以上是关于ViewPager2 中未显示图像(片段重新打开时)的主要内容,如果未能解决你的问题,请参考以下文章
带有片段和 Jetpack 导航的 Viewpager2:恢复片段而不是重新创建它们
焦点在 EditText 上时 ViewPager2 片段内容消失