目录:
彩蛋:数据传输图示例:
一、.准备两类数据:
1.第一类:新建一个实体类
//在Activity类的包下再创建一个包data,并在里面new一个java类:Person
package com.example.myemptyapplication.data;
public class Person {
//数据域:
private int imageId;//头像(图片的id是int型)
private String name;//名字
private String introduction;//简介
//构造函数:用于初始化对象的数据域!
public Person(int imageId,String name,String introduction){
this.imageId=imageId;
this.name=name;
this.introduction=introduction;
}
//下面这几个方法都是上面三个数据域的set和get
public int getImageId() {return imageId;}
public void setImageId(int imageId) {this.imageId = imageId;}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public String getIntroduction() {return introduction;}
public void setIntroduction(String introduction) {this.introduction = introduction;}
}
2、第二类:RecyclerView每一个子项的布局文件:
注意:布局大小需要斟酌:"wrap_content"还是其他:以下仅供参考
1、在layout目录下创建一个layout文件:布局任选合适的, 此处我选择默认的constraintlayout布局
2、自己配置这个子项的布局:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
...>>
<ImageView
android:id="@+id/imageView_item1"
... />
<TextView
android:id="@+id/textView_item2"
... />
<TextView
android:id="@+id/textView_item3"
.../>
</androidx.constraintlayout.widget.ConstraintLayout>
3.在Activity类中创建一个ArrayList集合,并存放对应的实体类的数据:
在这里,我们指定List的泛型为Person,表示我们需要在集合里面存放一个个Person数据。
//数据域:
List<Person> mPersonList = new ArrayList<>();
//初始化集合
private void initeListset() {
Person[] p=new Person[6];
for (int i = 0; i < 50; i++) {//实例化:50组相同的数据,方便观察体验。
p[0] = new Person(R.drawable.n1, "帅哥1号", "史蒂夫多部话剧都不回家第三步二班");
p[1] = new Person(R.drawable.n2, "帅哥2号", "好的发电设备的不得不");
p[2] = new Person(R.drawable.n3, "帅哥3号", "i的撒手锏警方的说法");
p[3] = new Person(R.drawable.n4, "帅哥4号", "我和我那些的厚度和接收方划分");
p[4] = new Person(R.drawable.m1, "美女", "四驱蚊器不得不说反对反对我");
p[5] = new Person(R.drawable.dm1, "动漫", "问问去恶趣味合法的二恶而我却额认为无参 手动");
}
for (int j = 0; j < 6; j++) {
mPersonList.add(p[j]);
}//添加到集合中
}
二、将RecyclerView加入到主页面上:
点击如图按钮拖动,再简单配置,记得加id——>即可:
然后添加一个id,方便我们在代码中引用它:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
...>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/myrecyclerview1"
.../>
</androidx.constraintlayout.widget.ConstraintLayout>
三、配置适配器,作为数据转移的中介:
因为数据不能直接由字符串等信息直接传到要显示它们的view上,所以需要中介。
:
在Activity类上加一个内/外部类PersonAdapter,并继承于RecyclerView.Adapter。
然后再写一个新类对应的内部类,继承于RecyclerView.ViewHolder
:
/******上面是Activity的代码*************************************************/
class PersonAdapter extends RecyclerView.Adapter<PersonAdapter.ViewHolder>{
//数据域:很显然它就是为了获取第一类数据到本适配器的
private List<Person> mPersonList;
/***********************************************************/
//新类对应的内部类:很显然它就是管理第二类数据(布局文件的四个view)的
static class ViewHolder extends RecyclerView.ViewHolder {
View mLayout;
ImageView mImageView;
TextView mTextView1;
TextView mTextView2;
//重写父类的一参构造函数,并利用此参数(View)对上面的数据域进行赋值:
public ViewHolder(@NonNull View itemView) {
super(itemView);
mLayout =itemView;//获取布局layout
mImageView=mLayout.findViewById(R.id.imageView_item1);//获取布局内的ImageView
mTextView1=mLayout.findViewById(R.id.textView_item2);//获取布局内的TextView1
mTextView2=mLayout.findViewById(R.id.textView_item3);//获取布局内的TextView2
}
}
//新类的构造函数:用于对本类的数据域(第一类数据)进行赋值
public PersonAdapter(List<Person> personList){
mPersonList=personList;
}
@NonNull
@Override
public PersonAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//第二类数据(布局文件)使用之处:
View mView= LayoutInflater.from(parent.getContext()).inflate(R.layout.person_iten,
parent, false);
//使用刚刚获取的这个mView示例,去实例化一个ViewHolder对象
ViewHolder mViewHodler=new ViewHolder(mView);
//在此用mViewHodler对象插入子项的事件,插入以后,再返回该对象
/*1.为子项的最外层(mLayout)添加事件:使用的是内部类的数据域中的——mLayout对像
注意:只有没有注册事件的子项v,点击才会向上调用上层的点击事件,
比如你为mImageView设置了点击事件,点击头像时,是不会调用这个mLayout对应的事件的
*/
mViewHodler.mLayout.setOnClickListener(v -> {
//在此添加事件的处理逻辑:
int position=mViewHodler.getAdapterPosition();
Person person=mPersonList.get(position);//获取当前项对应的第一类数据
//显示数据:
Toast.makeText(v.getContext(),"您点击了"+person.getName()+"的全身",Toast.LENGTH_SHORT).show();
});
//2.为子项的内层(mImageView)添加事件:使用的是内部类的数据域中的——mLayout对像
mViewHodler.mImageView.setOnClickListener(v -> {
//在此添加事件的处理逻辑:
});
// //3.为子项的内层(mTextView1)添加事件:使用的是内部类的数据域中的——mLayout对像
// mViewHodler.mTextView1.setOnClickListener(v -> {
// //在此添加事件的处理逻辑:
// });
// //4.为子项的内层(mTextView2)添加事件:使用的是内部类的数据域中的——mLayout对像
// mViewHodler.mTextView2.setOnClickListener(v -> {
// //在此添加事件的处理逻辑:
// });
//并返回(给系统)
return mViewHodler;
}
@Override
public void onBindViewHolder(@NonNull PersonAdapter.ViewHolder holder, int position) {
//获取当前位置的子项实例
Person mPerson=mPersonList.get(position);
/*
此处你可以看出是把第一类数据放进第二类数据,从而显示出来
*/
holder.mImageView.setImageResource(mPerson.getImageId());
holder.mTextView1.setText(mPerson.getName());
holder.mTextView2.setText(mPerson.getIntroduction());
}
@Override
public int getItemCount() {
//返回集合的长度,即Person个数:
return mPersonList.size();
}
}
四、整合:在Activity类中引用配置好的适配器
在Activity类中:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//添加如下代码:
initeListset();//初始化集合
RecyclerView mRecyclerView=findViewById(R.id.myrecyclerview1);//获取
/*此处是控制子项的布局,可改成其他的:
1、LinearLayoutManager 是线性的(垂直/水平)。
2、GridLayoutManager 是二维网格的,就像旧版 GridView 布局的功能。
3、StaggeredGridLayoutManager 将各项内容排列在二维网格中,
每一列都在前一列基础上稍微偏移。
4、如果上面的三种布局管理器都不符合您的需求,
您可以通过扩展 RecyclerView.LayoutManager 抽象类来创建自己的布局管理器。
如:网格形式:
StaggeredGridLayoutManager mLinearLayoutManager=new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
*/
LinearLayoutManager mLinearLayoutManager=new LinearLayoutManager(this);
mLinearLayoutManager.setOrientation(RecyclerView.HORIZONTAL);//水平滚动
mRecyclerView.setLayoutManager(mLinearLayoutManager);//设置布局方式
mRecyclerView.setAdapter(new PersonAdapter(mPersonList));
}
——>到此就可以拿出去显摆了。
更多请访问官网文档:
(https://developer.android.google.cn/guide/topics/ui/layout/recyclerview)