android-fragments 当包含ViewPager2的片段被停止并在稍后恢复时,如何从相同的位置恢复ViewPager2?

fdbelqdn  于 2022-11-13  发布在  Android
关注(0)|答案(1)|浏览(368)

我有一个ViewPager 2,它是一个水平的ImageView滚动器,它启用了自动滚动。这个自动滚动是用Timer.schedule()实现的。
我正在努力解决的问题是,我希望当包含该片段的片段不再对用户可见时,此自动滚动停止在那里,一旦用户恢复此片段,ViewPager应从它离开的同一位置开始自动滚动。
我的ViewPager代码:

  1. public class ChannelPagerViewHolder extends RecyclerView.ViewHolder {
  2. private static final int LIMIT = 7;
  3. private static final @ViewPager2.OffscreenPageLimit int OFFSCREEN_PAGE_LIMIT = 2;
  4. private Context mContext;
  5. private LifecycleOwner mLifecycleOwner;
  6. private ViewPager2 viewPager;
  7. private LiveData<List<ChannelItem>> mChannelItemList;
  8. private BannerAdapter bannerAdapter;
  9. private Handler mHandler;
  10. private int currentPage;
  11. private int prevPageNumber;
  12. public ChannelPagerViewHolder(View view, Context context, LifecycleOwner lifecycleOwner, int placement) {
  13. super(view);
  14. Log.d("ChannelPagerViewHolder","");
  15. mContext = context;
  16. mLifecycleOwner = lifecycleOwner;
  17. viewPager = view.findViewById(R.id.view_pager);
  18. viewPager.setOffscreenPageLimit(OFFSCREEN_PAGE_LIMIT);
  19. viewPager.getLayoutParams().width =
  20. (int) (Resources.getSystem().getDisplayMetrics().widthPixels);
  21. viewPager.getLayoutParams().height =
  22. viewPager.getLayoutParams().width / 2;
  23. bannerAdapter = new BannerAdapter(mContext, placement);
  24. viewPager.setAdapter(bannerAdapter);
  25. viewPager.setClipToPadding(false);
  26. viewPager.setPadding(24,0,24,0);
  27. // Hack to make left and right banner visible.
  28. RecyclerView recyclerView = ((RecyclerView) viewPager.getChildAt(0));
  29. recyclerView.setClipToPadding(false);
  30. UserEventLogger.getInstance(context).addImpressionLogger(
  31. recyclerView,
  32. placement
  33. );
  34. mHandler = new Handler();
  35. currentPage = 0;
  36. viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
  37. @Override
  38. public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
  39. super.onPageScrolled(position, positionOffset, positionOffsetPixels);
  40. currentPage = position;
  41. prevPageNumber = currentPage;
  42. }
  43. });
  44. new Timer().schedule(
  45. new TimerTask() {
  46. @Override
  47. public void run() {
  48. mHandler.post(new Runnable() {
  49. @Override
  50. public void run() {
  51. viewPager.setCurrentItem(currentPage++);
  52. }
  53. });
  54. }
  55. },
  56. 1000,
  57. 1000
  58. );
  59. }
  60. }

ViewPager的用户界面:My ViewPager
任何帮助都将不胜感激!

tpgth1q7

tpgth1q71#

由于您在RecyclerView的ViewHolder中使用ViewPager,因此需要将该特定项的ViewPagercurrentPosition存储在某个地方,并在重新绑定该项时恢复它。
我的解决方案是在类中使用一个可变字段来表示回收器视图的Item,并在每次ViewPager的页面更改时将其设置为一个新位置,然后在将该项反弹到ViewHolder时将其恢复。
您的Item类可以是这样的:

  1. class Item {
  2. List<Page> pages;
  3. int currentPage = 0;
  4. }

然后在你的ViewHolder

  1. public class ChannelPagerViewHolder extends RecyclerView.ViewHolder {
  2. // ...
  3. void bind(Item item) {
  4. // ...
  5. viewPager.setCurrentItem(item.currentPosition)
  6. viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
  7. @Override
  8. public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
  9. super.onPageScrolled(position, positionOffset, positionOffsetPixels);
  10. // ..
  11. item.currentPosition = position
  12. }
  13. });
  14. // ...
  15. }
  16. }
展开查看全部

相关问题