首页 > 解决方案 > ViewPager 的适配器

问题描述

所以我已经到了适配器的一部分,我必须将容器绑定到 ViewPager。我的问题是 ViewPager 本身动画的实际功能。通常,如果我要手动将实际图片放在那里,那么我会创建一个变量来表示项目列表并将它们放在适当的位置(即 info 变量)。但由于这是一个 API 调用,我不知道该怎么做。这是适配器和片段的代码。

适配器

class CarouselItemAdapter internal constructor (viewPager2: ViewPager2) : ListAdapter<CarouselItem,CarouselItemAdapter.CarouselViewHolder>(DiffCallback) {
    private val viewPager2: ViewPager2

    companion object DiffCallback : DiffUtil.ItemCallback<CarouselItem>() {
        override fun areItemsTheSame(oldItem: CarouselItem, newItem: CarouselItem): Boolean {
            return oldItem.id == newItem.id
        }

        override fun areContentsTheSame(oldItem: CarouselItem, newItem: CarouselItem): Boolean {
            return oldItem == newItem
        }

    }

    init {
        this.viewPager2 = viewPager2
    }

    override fun onCreateViewHolder(
        parent: ViewGroup,
        viewType: Int
    ): CarouselViewHolder {
       return CarouselViewHolder(CustomContainerBinding.inflate(
           LayoutInflater.from(parent.context),
           parent, false))
    }

    override fun onBindViewHolder(holder: CarouselViewHolder, position: Int) {
        holder.bind(getItem(position))
        if (position == info.size - 2) {
            viewPager2.post(runnable)
        }
    }


    class CarouselViewHolder(private val binding: CustomContainerBinding) : RecyclerView.ViewHolder(binding.root){
        fun bind(item: CarouselItem){
            binding.parts = item
            binding.executePendingBindings()
        }
    }

    private val runnable = Runnable {
        info.addAll(info)
        notifyDataSetChanged()
    }



    /** The "info" variable is used to have the container of the ViewPager act in a carousel like fashion
     * but since I am not putting the information in the container manually, I am not sure what to do here**/

}

片段

class MainFragment: Fragment() {

//    private lateinit var manager: RecyclerView.LayoutManager

    private lateinit var viewPager: ViewPager2
    private var counter: Int = 0
    private var pageChangeCallback: ViewPager2.OnPageChangeCallback? = null


    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val binding: MainFragmentBinding = DataBindingUtil.inflate(
            inflater,
            R.layout.main_fragment,
            container, false)

        viewPager = binding.imageSlider

//
//        val data: MutableList<CarouselItem> = ArrayList()
//        data.add(CarouselItem(1, "bcw_65", "First"))
//        data.add(CarouselItem(2, "bcw_66", "Second"))
//        data.add(CarouselItem(3, "bcw_67", "Third"))
//        data.add(CarouselItem(4, "bcw_68", "Fourth"))
//        data.add(CarouselItem(5, "bcw_69", "Fifth"))
//        data.add(CarouselItem(6, "bcw_70", "Sixth"))
//        data.add(CarouselItem(2, "bcw_71", "Seventh"))

        viewPager.adapter = CarouselItemAdapter(viewPager)



        viewPager.clipToPadding = false
        viewPager.clipChildren = false
        viewPager.offscreenPageLimit = 3
        viewPager.getChildAt(0).overScrollMode = RecyclerView.OVER_SCROLL_NEVER

        val compositePageTransformer = CompositePageTransformer()
        compositePageTransformer.addTransformer(MarginPageTransformer(30))
        compositePageTransformer.addTransformer { page, position ->
            val r = 1 - abs(position)
            page.scaleY = 0.85f + r * 0.25f
        }

        viewPager.setPageTransformer(compositePageTransformer)

        createChannel(
            getString(R.string.carousel_notification_id),
            getString(R.string.app_name)

        )


        val notificationManager = ContextCompat.getSystemService(
            requireContext(),
            NotificationManager::class.java,
        ) as NotificationManager




        //Used to count the number of swipes bing called
        viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
            override fun onPageSelected(position: Int) {
                counter++
                binding.counterView.text = counter.toString()
                if((counter % 20) == 0) {
                    notificationManager.sendNotification(
                        requireContext().getText(R.string.swipe_description).toString(), requireContext())
                }
            }
        }.also { pageChangeCallback = it })



        return binding.root
    }

    //Needed to destroy the pageChangeCallback
    override fun onDestroyView() {
        super.onDestroyView()
        viewPager.unregisterOnPageChangeCallback(pageChangeCallback!!)
        pageChangeCallback = null
    }

    private fun createChannel (channelID: String, channelName: String){
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val notificationChannel = NotificationChannel(
                channelID,
                channelName,
                NotificationManager.IMPORTANCE_HIGH
            )

            notificationChannel.enableLights(true)
            notificationChannel.lightColor = Color.WHITE
            notificationChannel.enableVibration(true)
            notificationChannel.description = getString(R.string.swipe_description)

            val notificationManager = requireActivity().getSystemService(
                NotificationManager::class.java
            )

            notificationManager.createNotificationChannel(notificationChannel)
        }
    }


}

我想用代表 API 的变量替换“信息”变量,这样我就可以将动画用于 ViewPager。任何想法来消除我的困惑将不胜感激。

标签: androidandroid-fragmentsandroid-viewpagerandroid-animation

解决方案


推荐阅读