ViewPager2 中未显示图像(重新打开 Fragment 时) [英] Image not shown in ViewPager2 (when Fragment reopened)

查看:100
本文介绍了ViewPager2 中未显示图像(重新打开 Fragment 时)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在我的 Android 应用程序的 Fragment 中实现了一个 ViewPager2,它将加载了 Uri 的图像显示到 ImageView(幻灯片放映库)中.一切正常,但是,当我关闭并重新打开 Fragment 时,图像没有加载.只有当我开始滑动 ViewPager2 时,图像才会再次加载到 ViewPager2 中.奇怪的是,此错误仅发生在较旧的 Android 版本上(已在 Android 6 上测试过),而不会发生在较新的版本(Android 10)上.我假设它可能与 Fragment(缓存或其他东西)有关,因为如果我在 Activity 中实现相同的代码,关闭并再次重新打开它,就不会发生错误.

I have implemented a ViewPager2 in a Fragment on my Android app, which displays images loaded with an Uri into an ImageView (slide show gallery). All works fine, however, when I close and reopen the Fragment, the image does not get loaded. Only when I start swiping the ViewPager2, the image gets loaded into the ViewPager2 again. Strangely, this error occurs on older Android versions only (have tested it on Android 6) but not on newer ones (Android 10). I assume it might have something to do with the Fragment (cache or something), because if I implement the same code in an Activity, close and reopen it again, the error does not occur.

知道如何解决此问题,以便图像始终以 Fragment 的形式加载到 ViewPager2 中吗?

Any idea how to resolve this issue, so that the image gets always loaded into the ViewPager2 in a Fragment?

Fragment中实现ViewPager2的代码:

val media= utilities.getMedia(this)
val mediaList = media.toMutableList()
       
val adapter = ViewPagerAdapter(mediaList)
photo_view_pager.adapter = adapter       

ViewPagerAdapter:

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)
        }
    }
}

预先感谢您的帮助!

推荐答案

请尝试以下带图片的viewpager方式

Please try the below way of viewpager with image

 <androidx.viewpager.widget.ViewPager
            android:id="@+id/viewPager"
            android:layout_width="match_parent"
            android:layout_height="match_parent">


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 中未显示图像(重新打开 Fragment 时)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆