android / views-widgets-samples

Multiple samples showing the best practices in views-widgets on Android.
Apache License 2.0
5.04k stars 3.01k forks source link

PageTransformer doesn't work with setCurrentItem #109

Open PatrykAndroid opened 4 years ago

PatrykAndroid commented 4 years ago

I added my custom PageTransformer and when I am scrolling by finger everything is ok, but when I try to set current item by setCurrentItem(without smooth scroll) method in ViewPager2, PageTransformer doesn't work and items random appear and disappear on my list.

wflfei commented 3 years ago

Same issue, do you have any solution?

rusvel commented 3 years ago

@wflfei I had a similar problem in the RecyclerView after data update. Solved the problem this way:

var adapter: CustomAdapter

var values: List<Item> = emptyList()
        set(value) {
            ...
            adapter.values = values
            notifyDataSetChanged()
        }

....

override fun onBindViewHolder(viewHolder: RecyclerView.ViewHolder, position: Int) {
    holder.viewPager.adapter = null   // Set null before each update
    adapter.notifyDataSetChanged()
    holder.viewPager.adapter = adapter

    holder.viewPager.setCurrentItem(position, false)
}
PatrykAndroid commented 3 years ago

I resolved this problem same way like @rusvel. You just need to set your adapter again.

wflfei commented 3 years ago

@PatrykAndroid @rusvel Thanks for your reply, I tried set adapter again after call setCurrentItem(position, false), but it didn't perform ok in my case. And I found a way to make it right like this:

image_view_pager?.setCurrentItem(args.pageIndex, false)
// 
image_view_pager?.postDelayed({
    (image_view_pager?.getChildAt(0) as RecyclerView).scrollBy(-1, 0)
    (image_view_pager?.getChildAt(0) as RecyclerView).scrollBy(1, 0)
}, 50)

I also add an issue here: (https://issuetracker.google.com/issues/169090368), Hope it will be fixed sometime.

davidmigloz commented 3 years ago

This worked to me:

val smoothScroll = false
viewPager2.setCurrentItem(index, smoothScroll)
if (!smoothScroll) {
      viewPager2.post { viewPager2.requestTransform() }
}
mohsen2986 commented 2 years ago

@PatrykAndroid @rusvel Thanks for your reply, I tried set adapter again after call setCurrentItem(position, false), but it didn't perform ok in my case. And I found a way to make it right like this:

image_view_pager?.setCurrentItem(args.pageIndex, false)
// 
image_view_pager?.postDelayed({
    (image_view_pager?.getChildAt(0) as RecyclerView).scrollBy(-1, 0)
    (image_view_pager?.getChildAt(0) as RecyclerView).scrollBy(1, 0)
}, 50)

I also add an issue here: (https://issuetracker.google.com/issues/169090368), Hope it will be fixed sometime.

it really work , but why this thing happen?? i face it on update my adapter datas , but Transformer had bad view on the last elements only

azatserzhan commented 2 years ago

viewPager.setCurrentItem(1, smoothScroll = false)