用viewpager写一个简易的轮播图
时间: 2023-12-07 20:06:00 浏览: 79
好的,下面是一个简单的示例:
1. 首先,在你的布局文件中添加 ViewPager 和指示器:
```xml
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<androidx.viewpager.widget.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="200dp" />
<LinearLayout
android:id="@+id/indicator_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal"
android:paddingTop="10dp"
android:paddingBottom="10dp" />
</LinearLayout>
```
2. 在你的 Activity 或 Fragment 中,定义一个 ArrayList 来存储轮播图的图片资源:
```java
private ArrayList<Integer> mImageResources = new ArrayList<>();
```
3. 在 onCreate 方法中,初始化 ViewPager 和指示器:
```java
ViewPager viewPager = findViewById(R.id.view_pager);
LinearLayout indicatorLayout = findViewById(R.id.indicator_layout);
// 将图片资源添加到 ArrayList 中
mImageResources.add(R.drawable.image1);
mImageResources.add(R.drawable.image2);
mImageResources.add(R.drawable.image3);
// 创建 Adapter
PagerAdapter adapter = new PagerAdapter(getSupportFragmentManager(), mImageResources);
// 设置 Adapter 和监听器
viewPager.setAdapter(adapter);
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
// 更新指示器
updateIndicator(position);
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
// 添加指示器
for (int i = 0; i < mImageResources.size(); i++) {
ImageView indicator = new ImageView(this);
indicator.setImageResource(R.drawable.indicator_unselected);
indicatorLayout.addView(indicator);
}
// 设置当前项为第一项
updateIndicator(0);
```
4. 创建 Adapter 类,并在其中实现轮播图的逻辑:
```java
public class PagerAdapter extends FragmentPagerAdapter {
private ArrayList<Integer> mImageResources;
public PagerAdapter(FragmentManager fm, ArrayList<Integer> imageResources) {
super(fm);
mImageResources = imageResources;
}
@Override
public Fragment getItem(int position) {
// 计算实际位置
position = position % mImageResources.size();
return ImageFragment.newInstance(mImageResources.get(position));
}
@Override
public int getCount() {
// 返回一个很大的数,保证可以循环滑动
return Integer.MAX_VALUE;
}
}
```
5. 创建 Fragment 类,用来显示图片:
```java
public class ImageFragment extends Fragment {
private int mImageResource;
public static ImageFragment newInstance(int imageResource) {
ImageFragment fragment = new ImageFragment();
Bundle args = new Bundle();
args.putInt("image_resource", imageResource);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mImageResource = getArguments().getInt("image_resource");
}
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
ImageView imageView = new ImageView(getContext());
imageView.setImageResource(mImageResource);
return imageView;
}
}
```
6. 最后,实现指示器的更新方法:
```java
private void updateIndicator(int position) {
LinearLayout indicatorLayout = findViewById(R.id.indicator_layout);
for (int i = 0; i < indicatorLayout.getChildCount(); i++) {
ImageView indicator = (ImageView) indicatorLayout.getChildAt(i);
if (i == position % mImageResources.size()) {
indicator.setImageResource(R.drawable.indicator_selected);
} else {
indicator.setImageResource(R.drawable.indicator_unselected);
}
}
}
```
这样就完成了一个简单的 ViewPager 轮播图。需要注意的是,为了实现循环滑动,Adapter 中 getCount 方法返回了一个很大的数,而getItem 方法中使用了取模运算符来计算实际位置。
阅读全文