目录
RecycleView
RecycleView简介
RecycleView纵向排列
首先在主布局中引入RecyclerView控件。
创建子布局,然后在子布局中,写好自己的子项布局
编写实体类
创建适配器
在主活动中使用
RecycleView横向排列
只需要在设置布局管理器的时候添加一个横向布局即可
RecycleView网格布局
RecycleView的点击事件
第一步,在适配器中的onBindViewHolder方法中给视图获取监听
第二步,在ViewHolder中设置视图
创建子布局,然后在子布局中,写好自己的子项布局
编写实体类
创建适配器
在主活动中使用
RecycleView
RecycleView简介
从Android 5.0开始,谷歌公司推出了一个用于大量数据展示的新控件RecylerView,可以用来代替 传统的ListView,更加强大和灵活。 RecyclerView是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,这 一点从它的名字Recyclerview即回收view也可以看出。 RecyclerView 支持 线性布局、网格布局、瀑布流布局 三种,而且同时还能够控制横向还是纵向滚 动。
1.容器性质的控件
2.用于大量数据展示的新控件
RecycleView纵向排列
首先在主布局中引入RecyclerView控件。
<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"
android:orientation="vertical"
tools:context=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_address"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
创建子布局,然后在子布局中,写好自己的子项布局
<?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="horizontal"
android:padding="10dp"
android:layout_height="wrap_content">
<View
android:layout_width="2dp"
android:layout_height="match_parent"
android:background="#FFFFFF" />
<ImageView
android:id="@+id/iv_img"
android:layout_width="50dp"
android:layout_height="50dp" />
<TextView
android:id="@+id/tv_tx"
android:layout_width="300dp"
android:layout_gravity="center_vertical"
android:textSize="20dp"
android:layout_height="wrap_content" />
</LinearLayout>
编写实体类
package com.wzk.recyclerview.model;
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;
}
}
创建适配器
package com.wzk.recyclerview.adapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.wzk.recyclerview.R;
import com.wzk.recyclerview.model.AddressBook;
import java.util.List;
public class AddressAdapter extends RecyclerView.Adapter<AddressAdapter.ViewHolder> {
//存储有多少条数据然后在getItemCount方法里做循环
private List<AddressBook> list;
public AddressAdapter(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);
//返回视图
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
//取出list中数据写进视图中
AddressBook addressBook = list.get(position);
holder.iv_img.setImageResource(addressBook.getImgid());
holder.tv_tx.setText(addressBook.getName());
holder.itemView.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 iv_img;
TextView tv_tx;
public ViewHolder(@NonNull View itemView) {
super(itemView);
view=itemView;
iv_img=itemView.findViewById(R.id.iv_img);
tv_tx=itemView.findViewById(R.id.tv_tx);
}
}
}
在主活动中使用
package com.wzk.recyclerview;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import com.wzk.recyclerview.adapter.AddressAdapter;
import com.wzk.recyclerview.model.AddressBook;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
//写要填的数据
private String[] names={"男一","男二","男三","男四","女一","女二","女三","女四"};
private int[] imgs={R.mipmap.men,R.mipmap.men,R.mipmap.men,R.mipmap.men,R.mipmap.nv,R.mipmap.nv,R.mipmap.nv,R.mipmap.nv};
private List<AddressBook> list=new ArrayList<>();
private RecyclerView rv_address;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//整合数据,存进list中
initData();
//根据id获取控件
rv_address=findViewById(R.id.rv_address);
//把适配器拿出来用,把list传进适配器中
AddressAdapter adapter=new AddressAdapter(list);
//在设置适配器之前设置布局管理器
LinearLayoutManager layoutManager=new LinearLayoutManager(this);
rv_address.setLayoutManager(layoutManager);
//给控件用适配器赋值
rv_address.setAdapter(adapter);
}
private void initData() {
for (int i = 0; i < names.length ;i++) {
AddressBook addressBook=new AddressBook(names[i],imgs[i]);
list.add(addressBook);
}
}
}
RecycleView横向排列
只需要在设置布局管理器的时候添加一个横向布局即可
//在设置适配器之前设置布局管理器
LinearLayoutManager layoutManager=new LinearLayoutManager(this);
layoutManager.setOrientation(RecyclerView.HORIZONTAL);
RecycleView网格布局
将布局管理器设置为GridLayoutManager
//根据id获取控件
rv_address=findViewById(R.id.rv_address);
//把适配器拿出来用,把list传进适配器中
AddressAdapter adapter=new AddressAdapter(list);
//在设置适配器之前设置布局管理器
GridLayoutManager layoutManager=new GridLayoutManager(this,3);
rv_address.setLayoutManager(layoutManager);
//给控件用适配器赋值
rv_address.setAdapter(adapter);
RecycleView的点击事件
RecyclerView的点击事件比ListView的点击事件更精确。 假如我是用的是ListView,那么我点击子项的时候,无论我点击图片还是文字,他都只知道,我点击了 子项。但是如果使用的是RecyclerView,他就可以准确地判断出我点击了文字还是图片! 修改代码其实也很简单,只用修改适配器里的代码。主要是给最外层布局和图片加了点击事件,所以点 击图片的时候会有Toast,点击文字的时候因为没有给文字注册点击事件,所以会被最外层布局捕捉到, 相当于点击了最外层布局。
第一步,在适配器中的onBindViewHolder方法中给视图获取监听
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(view.getContext(), addressBook.getName()+"被点击", Toast.LENGTH_SHORT).show();
}
});
第二步,在ViewHolder中设置视图
public class ViewHolder extends RecyclerView.ViewHolder{
View view;
ImageView iv_img;
TextView tv_tx;
public ViewHolder(@NonNull View itemView) {
super(itemView);
view=itemView;
iv_img=itemView.findViewById(R.id.iv_img);
tv_tx=itemView.findViewById(R.id.tv_tx);
}
}
ViewPager2继承于RecycleView
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/vp_swi"
android:layout_width="match_parent"
android:layout_height="match_parent" />
创建子布局,然后在子布局中,写好自己的子项布局
<RelativeLayout 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:id="@+id/lay_rl"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity2">
<TextView
android:id="@+id/tv_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="666"/>
</RelativeLayout>
编写实体类
public class Swiper {
private int scolor;
private String title;
public Swiper(int scolor, String title) {
this.scolor = scolor;
this.title = title;
}
public int getScolor() {
return scolor;
}
public String getTitle() {
return title;
}
}
创建适配器
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 inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_swiper, parent, false);
ViewHolder viewHolder = new ViewHolder(inflate);
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
int i=position%4;
Swiper swiper = list.get(i);
holder.lay_rl.setBackgroundColor(swiper.getScolor());
holder.tv_text.setText(swiper.getTitle());
}
@Override
public int getItemCount() {
return Integer.MAX_VALUE;
}
public class ViewHolder extends RecyclerView.ViewHolder{
RelativeLayout lay_rl;
TextView tv_text;
public ViewHolder(@NonNull View itemView) {
super(itemView);
lay_rl=itemView.findViewById(R.id.lay_rl);
tv_text=itemView.findViewById(R.id.tv_text);
}
}
}
在主活动中使用
因为ViewPager2是横向滑动排序的,所以不用添加布局管理器
public class MainActivity2 extends AppCompatActivity {
ViewPager2 vp_swi;
private List<Swiper> colors=new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
//整合数据
initColors();
//根据控件获取id
vp_swi=findViewById(R.id.vp_swi);
//适配器
SwiperAdapter viewPagerAdapter = new SwiperAdapter(colors);
//给控件添加适配器
vp_swi.setAdapter(viewPagerAdapter);
}
private void initColors() {
Swiper swiper=new Swiper(Color.BLUE,"666");
colors.add(swiper);
Swiper swiper2=new Swiper(Color.RED,"777");
colors.add(swiper2);
Swiper swiper3=new Swiper(Color.GREEN,"888");
colors.add(swiper3);
Swiper swiper4=new Swiper(Color.YELLOW,"888");
colors.add(swiper4);
}
}
|