如何使Horizontal Recyclerview无限滚动而不滚动回第一项
Posted
技术标签:
【中文标题】如何使Horizontal 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”以上是关于如何使Horizontal Recyclerview无限滚动而不滚动回第一项的主要内容,如果未能解决你的问题,请参考以下文章
ScrollView中的Horizontal RecyclerView:垂直滚动时如何获得焦点?
Flutter Horizontal ListView - 如何“跳转”选定的索引
Pod 副本缩减在 Kubernetes Horizontal Pod Autoscaler 中是如何工作的?
如何在 Kubernetes Horizontal Pod Autoscaling 中排除一些容器的指标
Kubernetes Horizontal Pod Autoscaler 如何计算多容器 Pod 的 CPU 利用率?
使用 Prometheus 适配器的 Horizontal Pod Autoscaler (HPA) 自定义指标(单位是如何定义的?)