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 片段内容消失

ViewPager2 无法动态添加删除片段

删除 viewPager2 中的片段使用 FragmentStateAdapter,但仍显示

键盘打开时,带有片段的活动不会调整大小

iOS 从远程通知打开时使用不同的启动画面?