RecyclerView 实现轮播
时间: 2023-11-16 19:43:04 浏览: 38
RecyclerView 实现轮播可以通过以下步骤实现:
1. 创建一个 RecyclerView,并设置为水平滚动。
2. 创建一个 Adapter,该 Adapter 中包含需要轮播的数据集合。
3. 在 Adapter 的 onCreateViewHolder() 方法中,创建一个 View,并使用该 View 初始化一个 ViewHolder。
4. 在 Adapter 的 onBindViewHolder() 方法中,根据当前索引获取需要展示的数据,并将数据展示在 ViewHolder 中。
5. 在 Adapter 中重写 getItemCount() 方法,返回一个较大的值,以便轮播无限循环。
6. 创建一个 Timer 和 TimerTask,用于定时切换轮播的图片。
7. 在 Activity 或 Fragment 中启动 Timer,实现自动轮播。同时,监听 RecyclerView 的滑动事件,在用户手动滑动时暂停自动轮播。
以下是示例代码:
1. 在布局文件中添加 RecyclerView:
```
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_banner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:clipToPadding="false"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:scrollbars="none"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:orientation="horizontal" />
```
2. 创建 Adapter:
```
public class BannerAdapter extends RecyclerView.Adapter<BannerAdapter.ViewHolder> {
private List<Banner> mBannerList;
public BannerAdapter(List<Banner> bannerList) {
mBannerList = bannerList;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_banner, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Banner banner = mBannerList.get(position % mBannerList.size());
Glide.with(holder.itemView)
.load(banner.getImageUrl())
.into(holder.mImageView);
}
@Override
public int getItemCount() {
return Integer.MAX_VALUE;
}
static class ViewHolder extends RecyclerView.ViewHolder {
ImageView mImageView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
mImageView = itemView.findViewById(R.id.iv_banner);
}
}
}
```
3. 在 Activity 或 Fragment 中初始化 RecyclerView:
```
List<Banner> bannerList = new ArrayList<>();
bannerList.add(new Banner("http://xxx.com/banner1.jpg"));
bannerList.add(new Banner("http://xxx.com/banner2.jpg"));
bannerList.add(new Banner("http://xxx.com/banner3.jpg"));
BannerAdapter bannerAdapter = new BannerAdapter(bannerList);
mRecyclerView.setAdapter(bannerAdapter);
```
4. 实现自动轮播:
```
private Timer mTimer;
private TimerTask mTimerTask;
private int mCurrentPosition;
private void startAutoPlay() {
mTimer = new Timer();
mTimerTask = new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
mCurrentPosition++;
mRecyclerView.smoothScrollToPosition(mCurrentPosition);
}
});
}
};
mTimer.schedule(mTimerTask, 3000, 3000);
}
private void stopAutoPlay() {
if (mTimer != null) {
mTimer.cancel();
mTimer = null;
}
if (mTimerTask != null) {
mTimerTask.cancel();
mTimerTask = null;
}
}
@Override
protected void onResume() {
super.onResume();
startAutoPlay();
}
@Override
protected void onPause() {
super.onPause();
stopAutoPlay();
}
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
switch (newState) {
case RecyclerView.SCROLL_STATE_IDLE:
startAutoPlay();
break;
case RecyclerView.SCROLL_STATE_DRAGGING:
case RecyclerView.SCROLL_STATE_SETTLING:
stopAutoPlay();
break;
}
}
});
```