【安卓】界面开发4:创建RecyclerView

彩蛋:数据传输图示例:

实例化存放于
适配器类的
适配器类数据域的
适配器类的
利用position
使用Person的数据域为内部类的数据域设置
在onCreateViewHolder函数中
将view对象传入内部类的
Person
List集合
构造函数MyAdapter
mAdapterList
函数onBindViewHolder内
提取当前页面的Person
获取Person对象的数据域
图片名字等
子项布局文件
用于构建一个view对象
构造函数
传入父类的构造函数

一、.准备两类数据:

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)

五、实战1:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值