1.RecycleView是什么?
从Android 5.0开始,谷歌公司推出了一个用于大量数据展示的新控件RecylerView,可以用来代替传统的ListView,更加强大和灵活。
RecyclerView是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,这一点从它的名字Recyclerview即回收view也可以看出。
RecyclerView 支持 线性布局、网格布局、瀑布流布局 三种,而且同时还能够控制横向还是纵向滚动。
1.2RecycleView的用法是什么?
布局文件:
1. 主布局文件中添加<RecycleView>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_view"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
2. 创建子项布局文件,并对其内部控件设置id
addressbook_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/lay_z">
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="240dp"
android:gravity="center"
android:text="TextView"
android:textSize="20sp" />
</RelativeLayout>
代码:
1.创建实体类(如果有需求)
AddressBook.java
public class AddressBook {
private String name;
private int imageID;
public AddressBook(String name, int imageID) {
this.name = name;
this.imageID = imageID;
}
public String getName() {
return name;
}
public int getImageID() {
return imageID;
}
}
2.创建适配器
AddressBookAdapter.java
public class AddressBookAdapter extends RecyclerView.Adapter<AddressBookAdapter.ViewHolder> {
private List<AddressBook> list;
public AddressBookAdapter(List<AddressBook> list){
this.list=list;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.addressbook_item, parent, false);
ViewHolder viewHolder=new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
AddressBook addressBook=list.get(position);
holder.AddressBookImage.setImageResource(addressBook.getImageID());
holder.AddressBookImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(view.getContext(), addressBook+"被点击", Toast.LENGTH_SHORT).show();
}
});
holder.AddressBookName.setText(addressBook.getName());
holder.view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(view.getContext(), addressBook.getName()+"被点击", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public int getItemCount() {
return list.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
View view;
ImageView AddressBookImage;
TextView AddressBookName;
public ViewHolder(@NonNull View itemView) {
super(itemView);
view=itemView;
AddressBookImage=itemView.findViewById(R.id.imageView);
AddressBookName=itemView.findViewById(R.id.textView2);
}
}
}
3.在活动中创建并设置适配器
MainActivity2.java
public class MainActivity2 extends AppCompatActivity {
// 组合的数据存放的地方
private List<AddressBook> list=new ArrayList<>();
private RecyclerView rv_view;
//从服务器返回的结果数据
String[] names={"冰糖葫芦","汉堡","可乐","咖啡","首页","薯条","雪糕","肘子"};
int[] imgs={R.mipmap.bingtanghulu,R.mipmap.hanbao,R.mipmap.kele,R.mipmap.kafei,R.mipmap.shouye,R.mipmap.shutiao,R.mipmap.xuegao,R.mipmap.zhouzi};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
initData();
RecyclerView recyclerView=findViewById(R.id.rv_view);
//设置布局管理器
LinearLayoutManager layoutManager=new LinearLayoutManager(this);
recyclerView.addItemDecoration(new DividerItemDecoration(this,LinearLayoutManager.VERTICAL));
recyclerView.setLayoutManager(layoutManager);
AddressBookAdapter fruitAdapter=new AddressBookAdapter(list);
recyclerView.setAdapter(fruitAdapter);
}
private void initData() {
for (int i=0;i<names.length;i++){
AddressBook addressBook=new AddressBook(names[i],imgs[i]);
list.add(addressBook);
}
}
}
4.在活动中设置排列方式及分隔线
//横向排列
layoutManager.setOrientation(layoutManager.HORIZONTAL);
//横向分割线
recyclerView.addItemDecoration(newDividerItemDecoration(this,LinearLayoutManager.VERTICAL);
5.设置点击事件
在AddressBookAdapter.java类中修改
2.ViewPager2
2.1ViewPager2是什么?
ViewPager2 是基于 RecyclerView 实现的,自然继承了 RecyclerView 的众多优点,并且针对 ViewPager 存在的问题做了优化。
支持垂直方向的滑动且实现极其简单。
完全支持 RecyclerView 的相关配置功能。
支持多个 PageTransformer。
支持 DiffUtil,局部数据刷新和 Item 动画。
支持模拟用户滑动与禁止用户操作。
2.2 ViewPager2的用法?
布局文件:
1. 主布局文件中添加<ViewPager2>
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/vp_swiper"
android:layout_width="match_parent"
android:layout_height="240dp" />
2. 创建子项布局文件,并对其内部控件设置id
swiper_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/lay_z">
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="240dp"
android:gravity="center"
android:text="TextView"
android:textSize="20sp" />
</RelativeLayout>
代码:跟上边差不多
1.创建实体类(如果有需求)
2.创建适配器
3.在活动中创建并设置适配器
4.CompositePageTransformer 与自定义 Transformer
5.实现一屏多页效果
2.3MarginPageTransformer用来来设置页面间距
MarginPageTransformer pageTransformer = new MarginPageTransformer(20);
vp_imgs.setPageTransformer(pageTransformer);
2.4CompositePageTransformer 与自定义 Transformer
//设置TransformerCompositePageTransformer
compositePageTransformer = new CompositePageTransformer();
//添加边距TransformercompositePageTransformer.addTransformer(new MarginPageTransformer(20));
//添加缩放效果的TransformercompositePageTransformer.addTransformer(newScaleInTransformer());
vp_imgs.setPageTransformer(compositePageTransformer);
2.5 实现一屏多页效果
//预加载页面数量
vp_imgs.setOffscreenPageLimit(1);
//一屏多页
View recyclerView = vp_imgs.getChildAt(0);
if(recyclerView != null && recyclerView instanceof RecyclerView){
recyclerView.setPadding(100, 0, 100, 0);
((RecyclerView) recyclerView).setClipToPadding(false);
}