0

So I created a carousel type app with pictures in them. I want to record the number of swipes the user does and have it displayed on a counter.

enter image description here

*The counter is next to "number of swipes"

Here is what I got so far in the code

class MainFragment: Fragment() {

//    private lateinit var manager: RecyclerView.LayoutManager
    private lateinit var viewPager: ViewPager2
    private var counter: Int = 0


    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(data, 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)

//        binding.imageSlider.setOnTouchListener{}
        binding.imageSlider.setOnTouchListener { v, event ->
            counter++
            Log.d(TAG, "onCreateView: Swipe Recorded")
            true
        }

        binding.counterView.text = counter.toString()




        return binding.root
    }

}

I have tried a few things, but it still doesn't seem to really work. Any ideas will be greatly appreciated.

Ryan M
  • 18,333
  • 31
  • 67
  • 74
OEThe11
  • 341
  • 2
  • 11
  • Does this answer your question? [How to detect the swipe left or Right in Android?](https://stackoverflow.com/questions/6645537/how-to-detect-the-swipe-left-or-right-in-android) – Sajeel Aug 07 '21 at 19:49
  • 2
    "I have tried a few things" - what are the few things you have tried? Is an OnPageChangedListener one thing you've tried? https://developer.android.com/reference/androidx/viewpager/widget/ViewPager.OnPageChangeListener – dominicoder Aug 07 '21 at 20:11
  • I have not tried OnPageChangedListener. Do you mind elaborating on that? – OEThe11 Aug 07 '21 at 20:35

1 Answers1

1

Add a ViewPager2.OnPageChangeCallback to your pager:

class MainFragment: Fragment() {
    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? {
        ...
        viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
            override fun onPageSelected(position: Int) {
                counter++
                binding.counterView.text = counter.toString()
            }
        }.also { pageChangeCallback = it })
        ...
    }

    override fun onDestroyView() {
        super.onDestroyView()
        viewPager.unregisterOnPageChangeCallback(pageChangeCallback!!)
        pageChangeCallback = null
    }
}
Sdghasemi
  • 5,370
  • 1
  • 34
  • 42
  • You are absolutely correct. I wasn't completely sure how to actually implement OnPageChangeCallback. I do appreciate it. – OEThe11 Aug 08 '21 at 20:11