如何使Horizo​​ntal Recyclerview无限滚动而不滚动回第一项

Posted

技术标签:

【中文标题】如何使Horizo​​ntal Recyclerview无限滚动而不滚动回第一项【英文标题】:How do I make Horizontal Recyclerview scroll infinitely without scrolling back to the first item 【发布时间】:2021-11-19 14:04:00 【问题描述】:

我有一个 Recyclerview,可以在活动开始时自动滚动。 recyclerview 中的项目是 4,但是当滚动到最后一个(第 4 个)项目时,它必须滚动回第一个项目才能重新开始。我想要的是滚动到最后一项时继续到第一项。我的代码如下所示:

private void setAdsRecyclerView() 
    layoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false) 

        @Override
        public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) 
            LinearSmoothScroller smoothScroller = new LinearSmoothScroller(getContext()) 

                private static final float SPEED = 300f;// Change this value (default=25f)

                @Override
                protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) 
                    return SPEED / displayMetrics.densityDpi;
                

            ;
            smoothScroller.setTargetPosition(position);
            startSmoothScroll(smoothScroller);
        

    ;

    adsRecyclerview.setHasFixedSize(true);
    adsRecyclerview.setLayoutManager(layoutManager);
    adsRecyclerview.setNestedScrollingEnabled(false);
    adsParseAdapter = new AdsParseAdapter(adsParseItems, getContext());
    adsRecyclerview.setAdapter(adsParseAdapter);

    LinearSnapHelper linearSnapHelper = new LinearSnapHelper();
    linearSnapHelper.attachToRecyclerView(adsRecyclerview);

    Timer timer = new Timer();
    timer.schedule(new TimerTask() 
        @Override
        public void run() 

            if (layoutManager.findLastCompletelyVisibleItemPosition() < adsParseAdapter.getItemCount() - 1) 
                layoutManager.smoothScrollToPosition(adsRecyclerview, new RecyclerView.State(), layoutManager.findLastCompletelyVisibleItemPosition() + 1);
             else 
                layoutManager.smoothScrollToPosition(adsRecyclerview, new RecyclerView.State(), 0);
            

        
    , 5000, 4000);

【问题讨论】:

【参考方案1】:

您可以在应用中使用 Viewpager 代替回收站视图。

swipeTimer = Timer()
        swipeTimer.schedule(object : TimerTask() 
            override fun run() 
                runOnUiThread 
                    if (num == NUM_PAGES) 
                        num = 0
                    
                    viewPager.setCurrentItem(num++, true)
                
            
        , 500, 3000)

此代码还会按您所需的时间自动滑动您的所有图像,并在最后一张之后返回到第一张。

适配器代码如下:

    class TempAdapter extends PagerAdapter 

    private Context context;
    ArrayList<Integer> imagesList = new ArrayList<>();
    LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    public TempAdapter(Context context, ArrayList<Integer> list) 
        this.context = context;
        this.imagesList = list;
    

    @Override
    public int getCount() 
        return imagesList.size();
    

    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object o) 
        return view == o;
    

    @NonNull
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, int position) 
        View itemView = layoutInflater.inflate(R.layout.your_layout,container,false);
        ImageView imageView = itemView.findViewById(R.id.ivImage);
        imageView.setImageResource(imagesList.get(position));
        container.addView(itemView);
        return itemView
    

    @Override
    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) 
        container.removeView((View) object);
    

并将 adater 设置为 viewpager,例如:

vpImageAdapter = VPImageAdapter(this, imageList)
viewPager.adapter = vpImageAdapter

【讨论】:

那么在ViewPager中如何使用适配器?? @crixus 我已经更新了代码 我使用的是 Java 而不是 Kotlin @crixus 我已经更新了代码 我收到此错误:“应用程序的 PagerAdapter 更改了适配器的内容,但未调用 PagerAdapter#notifyDataSetChanged!预期的适配器项目数:0,找到:4 Pager”

以上是关于如何使Horizo​​ntal Recyclerview无限滚动而不滚动回第一项的主要内容,如果未能解决你的问题,请参考以下文章

ScrollView中的Horizo​​ntal RecyclerView:垂直滚动时如何获得焦点?

Flutter Horizo​​ntal ListView - 如何“跳转”选定的索引

Pod 副本缩减在 Kubernetes Horizo​​ntal Pod Autoscaler 中是如何工作的?

如何在 Kubernetes Horizo​​ntal Pod Autoscaling 中排除一些容器的指标

Kubernetes Horizo​​ntal Pod Autoscaler 如何计算多容器 Pod 的 CPU 利用率?

使用 Prometheus 适配器的 Horizo​​ntal Pod Autoscaler (HPA) 自定义指标(单位是如何定义的?)