1.RecycleView
1.1简介
从
Android 5.0
开始,谷歌公司推出了一个用于
大量数据展示的新控件
RecylerView
,可以用来代替
传统的
ListView
,更加强大和灵活。
RecyclerView
是一个强大的滑动组件,与经典的
ListView
相比,同样拥有
item
回收复用的功能,这
一点从它的名字
Recyclerview
即回收
view
也可以看出。
RecyclerView
支持
线性布局
、
网格布局
、
瀑布流布局
三种,而且同时还能够控制横向还是纵向滚
动。
1.2使用流程
1.2.1布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_address"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
?1.2.2创建子布局。然后在子布局中,写好自己的子项布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:orientation="vertical"
android:background="@color/teal_200"
android:layout_height="60dp">
<ImageView
android:id="@+id/iv_img"
android:layout_width="90dp"
android:layout_height="30dp"
android:layout_gravity="center"
app:srcCompat="@mipmap/baocun01" />
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16dp"
android:gravity="center"
android:layout_gravity="center"
android:text="TextView" />
</LinearLayout>
1.2.3?编写实体类
public class AddressBook {
private String name;
private int imgid;
public AddressBook(String name, int imgid) {
this.name = name;
this.imgid = imgid;
}
public String getName() {
return name;
}
public int getImgid() {
return imgid;
}
}
1.2.4创建适配器
?创建一个新类继承RecyclerView.Adapter,并且将泛型指定为 AddressBookAdapter.ViewHolder。 一开始这么写会报错,因为ViewHolder是一个内部类,我们还没有定义。所以接下来我们就定义内部类。这个内部类的作用主要是通过传入的一个参数view,从而获取RecyclerView子项的最外层布局,然后通过findViewById()方法获取控件的实例(在本例 子中获取的是ImageViewTextView)。
然后定义全局变量
List
,生成构造函数。 这个构造函数是用来把要展示的数据源(图片、名字)传进来,并赋值给List
。
重写
onCreateViewHolder()
方法 这个函数主要是用来加载子项布局(
addressbook_item
),然后创建ViewHolder
实例并把子项布局传入到构造函数中,最后返回
ViewHolder
实例。
重写
onBindViewHolder()
方法 这个方法是用来对传入的子项布局进行赋值的,也就是说当子项布
局被传入进来,是它让布局有了名字、图片。它会在每个布局被滚动到屏幕的时候执行。在本例子
中,是通过
position
参数得到当前项的
AddressBook
实例,然后再把数据设置到
ViewHolder
的
ImageView
和
TextView
里。
重写
getItemCount()
方法 这个方法主要是用来返回数据源的长度,也就是告诉
RecyclerView
他有多
少个子项。
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.iv_img.setImageResource(addressBook.getImgid());
holder.iv_img.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(view.getContext(), addressBook.getName()+"被点击",Toast.LENGTH_LONG).show();
}
});
holder.tv_name.setText(addressBook.getName());
}
@Override
public int getItemCount() {
return list.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
TextView tv_name;
ImageView iv_img;
View view;
public ViewHolder(@NonNull View itemView) {
super(itemView);
view=itemView;
iv_img = itemView.findViewById(R.id.iv_img);
tv_name = itemView.findViewById(R.id.tv_name);
}
}
}
1.2.5在主活动中使用
public class MainActivity extends AppCompatActivity {
private String[] name={"周杰伦","胡歌","莉莉娜","李连杰","龙湖东墙","李娜和","联合抗日","联合抗日","联合抗日","联合抗日","联合抗日","联合抗日"};
private int[] img={R.mipmap.baocun01,R.mipmap.chaxun01,R.mipmap.chengzhong01,R.mipmap.dayin01,R.mipmap.faka01,R.mipmap.guanbi01,R.mipmap.hegezheng01,R.mipmap.quanxuan01,R.mipmap.shaixuan01,R.mipmap.shenhe01,R.mipmap.wenjian01,R.mipmap.xiazai01};
private List<AddressBook> list=new ArrayList<>();
private RecyclerView rv_address;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initDate();
rv_address = findViewById(R.id.rv_address);
// 设置横,纵向排列
// 只需要增加方向即可
rv_address.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));
AddressBookAdapter adapter=new AddressBookAdapter(list);
//创建LinearLayoutManager对象
//设置布局管理器
//网格布局为GridLayoutManager (GridLayoutManager gridLayoutManager = new GridLayoutManager(this,3);第二个参数为每排个数)
LinearLayoutManager layoutManager=new LinearLayoutManager(this);
rv_address.setLayoutManager(layoutManager);
rv_address.setAdapter(adapter);
}
private void initDate() {
for (int i = 0; i < name.length; i++) {
AddressBook addressBook=new AddressBook(name[i],img[i]);
list.add(addressBook);
}
}
}
2.Viewpager2
2.1简述
ViewPager2
是基于
RecyclerView
实现的,自然继承了
RecyclerView
的众多优点,并且针对
ViewPager
存在的问题做了优化。
支持垂直方向的滑动且实现极其简单。
完全支持
RecyclerView
的相关配置功能。
支持多个
PageTransformer
。
支持
DiffUtil
,局部数据刷新和
Item
动画。
支持模拟用户滑动与禁止用户操作。
2.2使用流程
2.2.1布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/vp_swiper"
android:layout_width="match_parent"
android:layout_height="300dp" />
</LinearLayout>
??2.2.2创建子布局。然后在子布局中,写好自己的子项布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rv_guide"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<TextView
android:id="@+id/tv_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:textSize="56dp"/>
</RelativeLayout>
2.2.3?编写实体类
public class Swiper {
private String info;
private int colors;
public Swiper(String info, int colors) {
this.info = info;
this.colors = colors;
}
public String getInfo() {
return info;
}
public int getColors() {
return colors;
}
}
2.2.4创建适配器
public class SwiperAdapter extends RecyclerView.Adapter<SwiperAdapter.ViewHolder> {
private List<Swiper> list;
public SwiperAdapter(List<Swiper> list) {
this.list = list;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.swiper_item, parent, false);
ViewHolder viewHolder=new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
int i = position % 3;
Swiper swiper=list.get(i);
holder.info.setText(swiper.getInfo());
holder.colors.setBackgroundColor(swiper.getColors());
}
@Override
public int getItemCount() {
//实现无限轮播
return Integer.MAX_VALUE;
}
public class ViewHolder extends RecyclerView.ViewHolder {
TextView info;
RelativeLayout colors;
public ViewHolder(@NonNull View itemView) {
super(itemView);
colors = itemView.findViewById(R.id.rv_guide);
info = itemView.findViewById(R.id.tv_info);
}
}
}
2.2.5在主活动中使用
public class MainActivity extends AppCompatActivity {
private List<Swiper> list=new ArrayList<>();
private ViewPager2 vp_swiper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initDate();
vp_swiper = findViewById(R.id.vp_swiper);
SwiperAdapter swiperAdapter=new SwiperAdapter(list);
//设置多个 Transformer 就是通过 CompositePageTransformer 实现
的。
CompositePageTransformer compositePageTransformer=new CompositePageTransformer();
compositePageTransformer.addTransformer(new MarginPageTransformer(20));
compositePageTransformer.addTransformer(new ScaleInTransformer());
vp_swiper4.setOffscreenPageLimit(1); //一屏多页
View recyclerView = vp_swiper.getChildAt(0);
if(recyclerView != null && recyclerView instanceof RecyclerView){
recyclerView.setPadding(100, 0, 100, 0);
((RecyclerView) recyclerView).setClipToPadding(false);
}
vp_swiper.setPageTransformer(compositePageTransformer);
vp_swiper.setAdapter(swiperAdapter);
}
private void initDate() {
Swiper swiper=new Swiper("黑色", Color.BLACK);
list.add(swiper);
Swiper swiper1=new Swiper("红色", Color.RED);
list.add(swiper1);
Swiper swiper2=new Swiper("绿色", Color.GREEN);
list.add(swiper2);
}
}
|