android - 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。任何想法来消除我的困惑将不胜感激。
解决方案
推荐阅读
- node.js - 模拟服务器中的重定向 url
- java - 如何在 Java Swing 中更改元素的颜色?
- javascript - 如何使用 element-ui 打开元素菜单?
- ios - 添加单元格,但不要关闭键盘 - CollectionView
- c# - 凭据正确时无法与 HttpClient 连接
- python - anaconda中conda、pip、pip3的区别
- intel - 为什么8086有奇偶库?
- c - 当我输入“-1”时,程序并没有停止,而是转到下面的“printf”。为什么?
- reactjs - 如何在 React 中构建仅限开发人员的 UI 部分?
- r - 带有堆叠 geom_bar 的 geom_text - 如何使它们兼容?