java - 如何使Horizontal 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);
}
解决方案
您可以在应用程序中使用 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
推荐阅读
- python - python pandas 以优雅的方式按条件逐行替换
- angular - 如何计算 IONIC 表单中多个输入字段的值并将其输出到表单中?
- python - Python迭代器奇怪地跳过项目
- localization - Xcode 10 中 Xib 上的本地化相关错误
- wordpress - 为某些已定义的用户角色创建 WordPress 用户登录系统的程序
- django - Django Rest JWT 身份验证 - 刷新令牌
- c++ - 如何在内核中添加包含库的路径?
- python - How to convert an integer into string without using in-built function?
- python - mocking all classes from a module in python
- c# - 获取会话状态而不从前端发送 HTTP 请求