обратный вызов из фрагмента в адаптере ViewPager2 - PullRequest
0 голосов
/ 07 февраля 2020

Хорошо, я получил следующий фрагмент с обратным вызовом, который я устанавливаю для адаптера ViewPager2:

    class PremiumFragment : BaseFragment(), OnPageChanged {

    override fun getLogTag(): String {
        return TAG
    }

    private lateinit var pagerCounter: ImageView
    private lateinit var viewPager: ViewPager2

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        viewPager = view.findViewById(R.id.view_pager) as ViewPager2
        viewPager.adapter = ViewPagerAdapter(this)
        pagerCounter = view.findViewById(R.id.counter)
    }

    companion object {
        const val TAG = "PremiumFragment"

        fun getInstance(): BaseFragment {
            Log.d(TAG, "getInstance()")
            val args = Bundle()
            args.putInt(ARG_LAYOUT_ID, R.layout.premium_f)
            val fragment =
                PremiumFragment()
            fragment.arguments = args
            return fragment
        }
    }

    override fun onPageChanged() {

        when (viewPager.currentItem) {
            0 -> pagerCounter.setImageResource(R.drawable.circle_1)
            1 -> pagerCounter.setImageResource(R.drawable.circle_2)
            2 -> pagerCounter.setImageResource(R.drawable.circle_3)
        }
    }
}

Мой адаптер:

class ViewPagerAdapter constructor(val callback: OnPageChanged) : RecyclerView.Adapter<PagerVH>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PagerVH =
        PagerVH(LayoutInflater.from(parent.context).inflate(R.layout.viewpager_f, parent, false))

    override fun getItemCount(): Int = Images.values().size

    override fun onBindViewHolder(holder: PagerVH, position: Int) = holder.itemView.run {
        pager_container.findViewById<ImageView>(R.id.imageView)
            .setImageResource(Images.values()[position].image)
    }

    override fun getItemViewType(position: Int): Int {
        callback.onPageChanged()
        return super.getItemViewType(position)
    }

    companion object {
        enum class Images(private val value: Int, val image: Int) {
            First(0, R.drawable.wow_girl),
            Second(1, R.drawable.insights_girl_2),
            Third(2, R.drawable.remind_girl);
        }
    }
}

Он должен каждый раз устанавливать новый объект рисования мы проводим ViewPager, но он изменяет изображение во фрагменте только один раз, после чего он не работает, совершенно не представляю, где в адаптере я должен вызвать свой обратный вызов для правильного поведения, пожалуйста, скажите мне, где я должен вызвать этот обратный вызов? Ценю любые советы!

1 Ответ

0 голосов
/ 07 февраля 2020

Итак, я обнаружил, что вы должны вызывать callback из onViewDetachedFromWindow, поскольку он вызывает каждый раз, когда вы проводите фрагмент, и это вполне логично

override fun onViewDetachedFromWindow(holder: PagerVH) {
        callback.onPageChanged()
        super.onViewDetachedFromWindow(holder)
    }
...