RecyclerView的基本使用

揭开RecyclerView的神秘面纱(一):RecyclerView的基本使用 详细讲述RecyclerView的用法 阅读详情

ListView功能是很强大的,直到现在还有很多程序在继续使用着ListView。不过ListView并不是没有缺点的,比如当数据量非常大的时候,如果不使用一些技巧提升它的运行效率,那么ListView的性能会非常差的。还有,ListView的扩展性也不够好,他只能实现数据纵向滚动的效果,如果想实现横向滚动的话,ListView是做不到的。

那么这时就需要一个更强大的滚动控件——RecyclerView。它可以说是一个增强版的ListView,不仅可以轻松实现和ListView同样的效果,还有优化了ListView中存在的各种不足之处。

RecyclerView的基本使用
首先在app的build.gradle中添加依赖:

implementation 'com.android.support:recyclerview-v7:26.1.0'

接着在activity_main.xml中修改代码:

<?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">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

然后为RecyclerView准备一个适配器:

/**
 * Created by Layne_Yao on 2018/6/8.
 * 优快云:http://blog.youkuaiyun.com/Jsagacity
 */
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
    private List<Person> personList;

    static class ViewHolder extends RecyclerView.ViewHolder {
        ImageView imgPortrait;
        TextView tvName, tvFruitAbility;

        /**
         * ViewHolder的构造方法
         * @param itemView 这个布局是RecyclerView子项最外层的布局
         */
        public ViewHolder(View itemView) {
            super(itemView);
            imgPortrait = itemView.findViewById(R.id.imgPortrait);
            tvName = itemView.findViewById(R.id.tvName);
            tvFruitAbility = itemView.findViewById(R.id.tvFruitAbility);
        }
    }

    /**
     * RecyclerViewAdapter的构造方法,
     * @param personList 传入的数据源
     */
    public RecyclerViewAdapter(List<Person> personList) {
        this.personList = personList;
    }

    /**
     * 此方法用于创建ViewHolder实例,并将要加载的布局传入到构造函数中
     * @param parent
     * @param viewType
     * @return
     */
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_person, parent, false);
        ViewHolder holder = new ViewHolder(view);

        return holder;
    }

    /**
     * 此方法用于对RecyclerView子项的数据进行赋值的,会在每个子项被滚动到屏幕内的时候执行
     * @param holder
     * @param position
     */
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        Person person = personList.get(position);
        holder.imgPortrait.setImageResource(person.getPortrait());
        holder.tvName.setText(person.getName());
        holder.tvFruitAbility.setText(person.getFruitAbility());

    }

    /**
     * 告诉RecyclerView一共有多少个子项
     * @return
     */
    @Override
    public int getItemCount() {
        return personList.size();
    }
}

上面会用到一个Person的实体类:

/**
 * Created by Layne_Yao on 2018/5/28.
 * 优快云:http://blog.youkuaiyun.com/Jsagacity
 */
public class Person {
    private int portrait;
    private String name;
    private String fruitAbility;

    public Person(int portrait, String name, String fruitAbility) {
        this.portrait = portrait;
        this.name = name;
        this.fruitAbility = fruitAbility;
    }

    public int getPortrait() {
        return portrait;
    }

    public void setPortrait(int portrait) {
        this.portrait = portrait;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getFruitAbility() {
        return fruitAbility;
    }

    public void setFruitAbility(String fruitAbility) {
        this.fruitAbility = fruitAbility;
    }
}

还缺一个item_person的子布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:padding="8dp">

    <ImageView
        android:id="@+id/imgPortrait"
        android:layout_width="50dp"
        android:layout_height="50dp" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:orientation="vertical"
        android:paddingLeft="8dp">

        <TextView
            android:id="@+id/tvName"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textColor="#333333"
            android:textSize="16sp" />

        <TextView
            android:id="@+id/tvFruitAbility"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textColor="#888888"
            android:textSize="14sp" />

    </LinearLayout>


</LinearLayout>

最后就是MainActivity.java的代码实现:

public class MainActivity extends AppCompatActivity {
    private List<Person> personList;
    private RecyclerView recyclerView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initData();
        recyclerView = findViewById(R.id.recyclerView);
        //纵向布局
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);

        recyclerView.setLayoutManager(layoutManager);
        RecyclerViewAdapter adapter = new RecyclerViewAdapter(personList);
        recyclerView.setAdapter(adapter);
    }

    private void initData() {
        personList = new ArrayList<>();
        personList.add(new Person(R.drawable.aisi, "艾斯", "烧烧果实,控制火的能力"));
        personList.add(new Person(R.drawable.lufei, "路飞", "橡皮果实,是一个橡皮人"));
        personList.add(new Person(R.drawable.luo, "罗", "手术果实,是一个很厉害的医生"));
        personList.add(new Person(R.drawable.aisi, "艾斯", "烧烧果实,控制火的能力"));
        personList.add(new Person(R.drawable.lufei, "路飞", "橡皮果实,是一个橡皮人"));
        personList.add(new Person(R.drawable.luo, "罗", "手术果实,是一个很厉害的医生"));
        personList.add(new Person(R.drawable.aisi, "艾斯", "烧烧果实,控制火的能力"));
        personList.add(new Person(R.drawable.lufei, "路飞", "橡皮果实,是一个橡皮人"));
        personList.add(new Person(R.drawable.luo, "罗", "手术果实,是一个很厉害的医生"));
        personList.add(new Person(R.drawable.aisi, "艾斯", "烧烧果实,控制火的能力"));
        personList.add(new Person(R.drawable.lufei, "路飞", "橡皮果实,是一个橡皮人"));
        personList.add(new Person(R.drawable.luo, "罗", "手术果实,是一个很厉害的医生"));
        personList.add(new Person(R.drawable.aisi, "艾斯", "烧烧果实,控制火的能力"));
        personList.add(new Person(R.drawable.lufei, "路飞", "橡皮果实,是一个橡皮人"));
        personList.add(new Person(R.drawable.luo, "罗", "手术果实,是一个很厉害的医生"));

    }

}

就这样最基本的显示就完成了,运行结果如下:
这里写图片描述

上面是最简单的数据展示了,RecyclerView其实还有很多布局,上面是纵向布局LinearLayoutManager,还可以切换成横向布局,瀑布流布局StaggeredGridLayoutManager和网格布局GridLayoutManager。





里就不一一说明,直接在上面的例子改成个布局的切换,以及item的点击事件。
点击事件要改的是适配器里面的代码:

/**
 * Created by Layne_Yao on 2018/6/8.
 * 优快云:http://blog.youkuaiyun.com/Jsagacity
 */
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
    private List<Person> personList;

    static class ViewHolder extends RecyclerView.ViewHolder {
        View personView;
        ImageView imgPortrait;
        TextView tvName, tvFruitAbility;

        /**
         * ViewHolder的构造方法
         * @param itemView 这个布局是RecyclerView子项最外层的布局
         */
        public ViewHolder(View itemView) {
            super(itemView);
            personView = itemView;
            imgPortrait = itemView.findViewById(R.id.imgPortrait);
            tvName = itemView.findViewById(R.id.tvName);
            tvFruitAbility = itemView.findViewById(R.id.tvFruitAbility);
        }
    }

    /**
     * RecyclerViewAdapter的构造方法,
     * @param personList 传入的数据源
     */
    public RecyclerViewAdapter(List<Person> personList) {
        this.personList = personList;
    }

    /**
     * 此方法用于创建ViewHolder实例,并将要加载的布局传入到构造函数中
     * @param parent
     * @param viewType
     * @return
     */
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_person, parent, false);
        final ViewHolder holder = new ViewHolder(view);
        //子项的点击事件
        holder.personView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int position = holder.getAdapterPosition();
                Person person = personList.get(position);
                Toast.makeText(view.getContext(),position+":"+person.getName(),Toast.LENGTH_SHORT).show();
            }
        });

        //图片的点击事件
        holder.imgPortrait.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int position = holder.getAdapterPosition();
                Person person = personList.get(position);
                Toast.makeText(view.getContext(),position+":"+person.getName(),Toast.LENGTH_SHORT).show();
            }
        });
        return holder;
    }

    /**
     * 此方法用于对RecyclerView子项的数据进行赋值的,会在每个子项被滚动到屏幕内的时候执行
     * @param holder
     * @param position
     */
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        Person person = personList.get(position);
        holder.imgPortrait.setImageResource(person.getPortrait());
        holder.tvName.setText(person.getName());
        holder.tvFruitAbility.setText(person.getFruitAbility());

    }

    /**
     * 告诉RecyclerView一共有多少个子项
     * @return
     */
    @Override
    public int getItemCount() {
        return personList.size();
    }
}

MainActivity中的代码修改成:

public class MainActivity extends AppCompatActivity {
    private List<Person> personList;
    private RecyclerView recyclerView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initData();
        recyclerView = findViewById(R.id.recyclerView);
        //纵向布局
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);

        recyclerView.setLayoutManager(layoutManager);
        RecyclerViewAdapter adapter = new RecyclerViewAdapter(personList);
        recyclerView.setAdapter(adapter);
    }

    private void initData() {
        personList = new ArrayList<>();
        personList.add(new Person(R.drawable.aisi, "艾斯", "烧烧果实,控制火的能力"));
        personList.add(new Person(R.drawable.lufei, "路飞", "橡皮果实,是一个橡皮人"));
        personList.add(new Person(R.drawable.luo, "罗", "手术果实,是一个很厉害的医生"));
        personList.add(new Person(R.drawable.aisi, "艾斯", "烧烧果实,控制火的能力"));
        personList.add(new Person(R.drawable.lufei, "路飞", "橡皮果实,是一个橡皮人"));
        personList.add(new Person(R.drawable.luo, "罗", "手术果实,是一个很厉害的医生"));
        personList.add(new Person(R.drawable.aisi, "艾斯", "烧烧果实,控制火的能力"));
        personList.add(new Person(R.drawable.lufei, "路飞", "橡皮果实,是一个橡皮人"));
        personList.add(new Person(R.drawable.luo, "罗", "手术果实,是一个很厉害的医生"));
        personList.add(new Person(R.drawable.aisi, "艾斯", "烧烧果实,控制火的能力"));
        personList.add(new Person(R.drawable.lufei, "路飞", "橡皮果实,是一个橡皮人"));
        personList.add(new Person(R.drawable.luo, "罗", "手术果实,是一个很厉害的医生"));
        personList.add(new Person(R.drawable.aisi, "艾斯", "烧烧果实,控制火的能力"));
        personList.add(new Person(R.drawable.lufei, "路飞", "橡皮果实,是一个橡皮人"));
        personList.add(new Person(R.drawable.luo, "罗", "手术果实,是一个很厉害的医生"));

    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        menu.add(0, 1, 0, "切换LinearLayoutManager");
        menu.add(0, 2, 0, "切换成横向布局");
        menu.add(0, 3, 0, "切换StaggeredGridLayoutManager");
        menu.add(0, 4, 0, "切换GridLayoutManager");
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case 1:
                //纵向布局
                LinearLayoutManager layoutManager = new LinearLayoutManager(this);
                recyclerView.setLayoutManager(layoutManager);
                break;
            case 2:
                LinearLayoutManager layoutManager1 = new LinearLayoutManager(this);
                //横向布局
                layoutManager1.setOrientation(LinearLayoutManager.HORIZONTAL);
                recyclerView.setLayoutManager(layoutManager1);
                break;
            case 3:
                //瀑布流布局
                StaggeredGridLayoutManager layoutManager2 = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);
                recyclerView.setLayoutManager(layoutManager2);
                break;
            case 4:
                //网格布局
                GridLayoutManager layoutManager3 = new GridLayoutManager(this, 2);
                recyclerView.setLayoutManager(layoutManager3);
                break;
        }
        return true;
    }
}

运行结果:
这里写图片描述
源码已经全部贴出来了,所以就不提供源码下载了

Android 中 RecyclerView 的基本使用 Android 中 RecyclerView 的基本使用 RecyclerView 能够灵活实现大数据集的展示, 视图的复用管理比 ListView 更好, 能够显示列表、网格、瀑布流等形式, 且不同的 ViewHolder 能够实现 item 多元化的功能. 但是使用起来会稍微麻烦一点, 并且没有类似 ListView 的 onItemClickListene r监听事件, 需要开发者自己实现. 新版本不用导入下面依赖的 implementation 'com.android.support: 阅读详情

相关推荐

用户存续期价值评估CLV(二) BG/NBD Model python模拟

BG/NBD Model …继续 想象每一个客户有两个硬币,一个“Buy Coin"控制客户购买的概率;一个"Die Coin"控制客户流失、不再购买的概率。 前面假设了客户的交易次数服从泊松过程: 在一年中的每个月,客户都以抛硬币的方式来决定是否购买。我们所观察到的购买次数取决与泊松分布的参数 ????。 %matplotlib inline import numpy as np impor...

weixin_43171270的博客 3422

整理:Android自带、第三方需要添加依赖的控件

Android自带的 Android的design库 compile 'com.android.support:design:23.3.0' Android的recyclerview compile 'com.android.support:recyclerview-v7:23.3.0' cardview(卡片布局控件) compile 'com.android...

芒果蜜桃π 1317

反激电源反馈环路设计:从TL431+PC817原理到动态补偿实战

本文深入解析了反激电源中由TL431和PC817构成的经典反馈环路设计。从静态工作点计算到动态补偿实战,详细阐述了如何通过Type II补偿网络优化环路稳定性与动态响应,并分享了应对光耦CTR离散性、布局噪声等常见调试难题的实用技巧,帮助工程师设计出高性能、高可靠的开关电源。

moon9的博客 699

Android基础学习总结(二)——六步轻松搞定RecyclerView简单应用

0. 引言 ListView在一些简单场合应用是绰绰有余的,但是在复杂场合例如需要实时更新或者实现瀑布流等炫酷效果时就需要做许多工作来提高运行效率,这时候性能就显得很一般,同时扩展性也不够强,只能横向滚动等问题无法解决。 为此,Android提供了一种更强大的滚动控件——RecyclerView。它是一个增强版ListView,可以完全替代ListView并且优化了不足,增加了许多可扩展功能。

. 661

Labelme安装教程(附Anaconda安装教程)

本文详细介绍了如何安装Anaconda和Labelme,还提供了常见问题的解决建议。

HanYan_ing的博客 1万+

C++ muduo网络库知识分享01 - Linux平台下muduo网络库源码编译安装

Muduo is a multithreaded C++ network library based on the reactor pattern. muduo库的介绍就是:一个基于reactor反应堆模型的多线程C++网络库。 muduo网络库是C++语言开发的一个非常优秀的网络库,作者陈硕,muduo网络库在多线程环境下性能非常高,该系列文章会分享一些muduo库源码的知识,包括它的线程池源码...

大秦坑王的专栏 3万+

17、Android -- RecyclerView 基础学习

android -- 学习笔记

u013059089的博客 1049

【gcc】跨版本兼容实战:高版本编译程序在低版本glibc环境下的部署方案

本文针对高版本gcc编译的程序在低版本glibc环境下部署的兼容性问题,提供了四种实战解决方案:静态编译的局限性、容器化部署的优雅方案、使用Devtoolset工具链的官方支持,以及最通用灵活的打包依赖SO发布方案。重点剖析了通过设置RPATH和Interpreter或使用patchelf工具,实现程序与自带库的独立部署,有效解决glibc版本鸿沟。

weixin_29237635的博客 358

RecyclerView详解

RecyclerView 简称 RV, 是作为 ListView 和 GridView 的加强版出现的,目的是在有限的屏幕之上展示大量的内容,因此 RecyclerView 的复用机制的实现是它的一个核心部分。 RV 常规使用方式如下: 解释说明。 setLayoutManager:必选项,设置 RV 的布局管理器,决定 RV 的显示风格。常用的有线性布局管理器(LinearLayoutManager)、网格布局管理器(GridLayoutManager)、瀑布流布局管理器(StaggeredGr

Android 4万+

【Prometheus】prometheus结合cAdvisor监控docker容器运行状态,并且实现实时告警通知

Docker的监控,可以使用Docker自带的stats命令来获取当前主机上运行中的容器的资源使用情况。 例如:容器的CPU使用率、内存占用、网络IO以及磁盘IO等指标。

景天科技苑 6万+

RandLA-Net Tensorrt 推理 c++

RandLA-Net 实现 Tensorrt 部署.

J。 1108

Android基础——RecyclerView

RecycleViewRecycleView是什么?RecycleView使用三级目录 RecycleView是什么? RecycleView是进阶版的ListView,不仅可以实现ListView的纵向滑动,还可以横向滑动和瀑布流滑动。 RecycleView使用 使用RecycleView需要在build.gradle中添加相应的依赖库 三级目录 ...

松仔Log的博客 1万+

原理和代码解读:用Diffusion Models高清图像修复(Image Inpainting)

在最近的Diffusion Models应用中,Image Inpainting+ControlNet/Lora等工作在模特衣服生成、家居场景重建等场景中得到了广泛的应用。这篇博客主要介绍Diffusion Models如何在修复高清图像的。

沉迷单车的追风少年 2497

RecyclerView基本使用

RecyclerView是android 5.0推出的新的控件,官方给出的说明是: RecyclerView is a more advanced and flexible version of ListView. This widget is a container for large sets of views that can be recycled and scrolled ve

大写的Z 2503

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

RecyclerView系列 - RecyclerView的基本使用

前言 RecyclerView 在本文发布之前,已经出来很久了,之前也有很多关于 RecyclerView 的优秀文章,那我为什么还要在这里写下本文呢,实不相瞒,我是 ListView 的忠实粉,之前很少使用到 RecyclerView,最近发现了不少关于 RecyclerView 的优秀框架,于是开始使用 RecyclerView,在使用第三方优秀框架的同时,也需要了解框架背后对组件进行的处理及...

一个IT人的技术成长历程。 4218

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

RecyclerView的基本使用方法

作为ListView的豪华加强版,Android支持库中的RecyclerView具有诸多优点。 本篇博客主要用于记录RecyclerView的基本使用方法。

橡果生长记的博客 2963

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Android Studio RecyclerVIew的基本使用

RecyclerVIew的基本使用 本博客主要讲述RecyclerView的四种基本使用方法:纵向列表视图、横向列表视图、网格视图、瀑布流视图,并且对他们实现一些拓展效果。 本文主要是对纵向列表视图进行一步一步的详细讲解,比较接近的横向列表视图、网格视图、瀑布流视图等提供了源码。 比较适合刚刚入门的小白查看 1.添加依赖 在project下的build.gradle下添加语句,如果有新版本,按照提示修改版本数字即可,此版本当前为最新版本,并点击右上角的跳出的提醒的 sync now implementati

wzy1120433847的博客 1万+

RecyclerView(二)—— RecyclerView的使用

RecyclerView ListView由于强大的功能,在过去的Android开发当中可以说是贡献卓越,直到今天仍然还有不计其数的程序在使用ListView。不过ListView并不是完美无缺的,比如如果不使用一些技巧来提升它的运行效率,那么ListView的性能就会非常差。还有,ListView的扩展性也不够好, 它只能实现数据纵向滚动的效果,如果我们想实现横向滚动的话,ListView是做不到的。 为此,Android提供了一个更强大的滚动控件——RecyclerView。它可以说是一个增强版的Lis

xingyu19911016的博客 1938

Android RecyclerView基本使用

通过一个简短的案例介绍了如何使用recyclerview创建列表,而不是使用老旧的listview方法

delete_you的博客 1042

RecyclerView如何嵌套RecyclerView

Linearlayoutmanager RecyclerView嵌套GridLayoutManager RecyclerView 布局方式:以一个GridLayoutManager的recyclerview作为Linearlayoutmanager RecyclerView的itemview MainRecyclerAdapter.java public class MainRecyclerAdapter extends RecyclerView.Adapter<MainRecyclerAdap

Jonly_W的博客 2845

Android控件之RecyclerView的基本使用

一、为什么叫RecyclerView? 1.不关心Item是否显示在正确的位置、如何显示。 2.不关心Item间的分割线。 3.不关注Item增加和删除的动画效果。 4.仅仅关注如何回收和复用View。 二、RecyclerView的基本属性: 1.RecyclerView.Adapter:托管数据集合,为每个Item创建视图; 2.R

Wtoria的博客 1148

Android控件之RecyclerView基本介绍

(这篇文章很早就写好了,却不知道为何一直被放在草稿箱里......今天发现就重新发下。) RecyclerView推出来已经很久了,许多项目中也早已用它代替了之前的ListView。今天就来简单介绍下这个新朋友。 1.RecyclerView基本认识 RecyclerView是Android5.0发布的时候推出的一个全新控件,可以支持API 7以上的版本。展示的效果类似于ListView,是...

ITMonkeyKing的博客 2095
上一篇: 生命不息,折腾不止
下一篇: Android实现简易示波器
LayneYao
博客等级 码龄10年 449粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值