首页 > 解决方案 > 如何使Horizo​​ntal Recyclerview无限滚动而不滚动回第一项

问题描述

我有一个 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);
}

标签: javaandroidandroid-studioandroid-recyclerviewsmooth-scrolling

解决方案


您可以在应用程序中使用 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

推荐阅读