[Android基础]Android中ListView详解

Android UI 组件系列(八):ListView 基础用法与适配器详解 本文介绍了Android中ListView组件的基础使用方式。主要内容包括:ListView的UI结构和渲染机制;通过ArrayAdapter快速展示简单文本列表;使用SimpleAdapter实现图文混排效果;设置点击事件和选中状态的两种方法;以及一个完整的图文混排列表实现示例。虽然RecyclerView已成为更现代的替代方案,但ListView仍是理解Android适配器机制和列表组件的重要入门途径,在快速原型开发中仍具实用价值。 阅读详情

ListView是手机系统中非常常用的一个组件,以垂直列表的形式显示所有列表项,今天我们来探索一下吧。
首先我们来了解一下ListView的基本属性吧。

XML属性
andorid:divider:设置List列表项的分隔条(既可用颜色分隔,也可用Drawable分隔)
android:dividerHeight:设置分隔条的高度
android:entries:设置一个数组资源,Android将根据该数组资源来生成ListView
android:footerDividersEnabled:如果设置为false,则不在footer View之前绘制分隔条
android:headerDividersEnabled:如果设置为false,则不在headerView之后绘制分隔条

接下来通过一个非常简单的案例来体验一下(使用Android Studio):
activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:entries="@array/hero"
        android:divider="#ff93ff87"
        android:dividerHeight="2px"
        android:headerDividersEnabled="false">
        </ListView>

</LinearLayout>

这里在values文件夹下加了一个arrays.xml文件,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="books">
        <item>乔布斯</item>
        <item>拉里.佩奇</item>
        <item>谢尔盖</item>
        <item>扎克伯格</item>
    </string-array>
</resources>

真机上效果如下:

然而用数组的方式还不是太简单了呢?给人的感觉不够酷。如果想要对ListView的外观、行为进行定制,就需要把ListView作为AdapterView使用,通过Adapter控制每个列表项的外观和行为。现在你会问:什么是AdapterView了吧?
AdapterView的本质是容器,继承了ViewGroup。如上例,AdapterView可以包括多个列表项,更重要的是,可将多个列表项以合适的形式来现实,合适的形式就是我们要的炫酷的效果。而AdapterView显示的多个列表项由Adapter提供,调用AdapterView中的setAdapter(Adapter)方法即可。
那Adapter又是个什么东西呢?
Adapter本身是一个接口,派生了ListAdapter和SpinnerAdapter两个子接口。而非常常见的BaseAdapter实现了ListAdapter和SpinnerAdapter两个接口。我们常用的ArrayAdapter和SimpleAdapter都实现了BaseAdapter的接口。现在我们介绍一下ArrayAdapter常用的实现类吧。
ArrayAdapter:简单、易用,通常用于将List集合的多个值包装成多个列表项。
SimpleAdapter:并不简单、功能强大的Adapter,可用于将List集合的多个对象包装成多个列表项。
SimpleCursorAdapter:与SimpleAdapter基本相似,只是用于包装Cursor提供的数据。
BaseAdapter:通常用于被扩展,扩展BaseAdapter可以对各列表项进行最大限度的定制。
是不是有点晕了呢?接下来我们通过一个实例来理解。
activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">
    <ListView
        android:id="@+id/listfirst"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:divider="#f00"
        android:dividerHeight="2px"
        android:headerDividersEnabled="false"></ListView>
</LinearLayout>

MainActivity.java

public class MainActivity extends ActionBarActivity {

    private ListView listFirst;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listFirst = (ListView) findViewById(R.id.listfirst);
        String[] arr = {"乔布斯", "周星驰", "周杰伦"};
        //将数组包装成ArrayAdapter
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.array_item, arr);
        //为ListView设置Adapter
        listFirst.setAdapter(adapter);
    };
}

array_item.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/TextView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"    
    android:textSize="24dp"
    android:padding="10px"
    android:shadowColor="#f0f"
    android:shadowDx="4"
    android:shadowDy="4"
    android:shadowRadius="2"/>

真机效果如下:

当然也可以直接集继承ListActivity啦,那样无需使用布局文件。

public class MainActivity extends ListActivity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        String[] arr = {"乔布斯", "周星驰", "周杰伦"};
        //创建ArrayAdapter对象
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.checked_item, arr);
        setListAdapter(adapter);
    }
}

相信看到上面的代码,对这行代码肯定有疑问。
ArrayAdapter adapter = new ArrayAdapter(this, R.layout.checked_item, arr);
第一个参数(Context):它代表了访问整个Android应用的接口。几乎创建所有组件都需要传递进来Context对象。
第二个参数(textViewResourceId):一个资源ID,该资源ID代表一个TextView,该TextView将作为ArrayAdapter的列表项组件。
第三个参数(数组或List):为多个列表项提供数据。

是不是很简单呢?但是觉得还是太单调,接下来我们继续SimpleAdapter的学习。

activity_mai.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >

    <ListView 
        android:id="@+id/mylist"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"></ListView>

</LinearLayout>

然后我们设置Item的样子。
simple_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
<!-- 定义一个ImageView,用于作为列表项的一部分。 -->
<ImageView android:id="@+id/header"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:paddingLeft="10dp"
    />
<LinearLayout
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
<!-- 定义一个TextView,用于作为列表项的一部分。 -->
<TextView android:id="@+id/name"
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"
    android:textSize="20dp"
    android:textColor="#f0f"
    android:paddingLeft="10dp"
    />
<!-- 定义一个TextView,用于作为列表项的一部分。 -->
<TextView android:id="@+id/desc"
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"
    android:textSize="14dp"
    android:paddingLeft="10dp"
    />
</LinearLayout>
</LinearLayout>

MainActivity如下:

package com.example.simpleadapter;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.net.LocalSocketAddress.Namespace;
import android.os.Bundle;
import android.renderscript.Int2;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;

public class MainActivity extends Activity {

    private String[] names = new String[]{"小明", "小红", "小兰"};
    private String[] descs = new String[]
            {
                "小学生", "中学生", "大学生"
            };
    private int[] imageIds = new int[]{
        R.drawable.ic_launcher, R.drawable.ic_launcher,
        R.drawable.ic_launcher
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //创建一个List集合,List集合的元素是Map
        List<Map<String, Object>> listItems = new ArrayList<Map<String,Object>>();
        for(int i = 0; i < names.length; i++)
        {
            Map<String, Object> listItem = new HashMap<String, Object>();
            listItem.put("header", imageIds[i]);
            listItem.put("personName", names[i]);
            listItem.put("desc", descs[i]);
            listItems.add(listItem);
        }
        //创建一个SimapleAdapter
        SimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems,
                R.layout.simple_item,
                new String[]{"personName", "header", "desc"},
                new int[]{R.id.name, R.id.header, R.id.desc});
        ListView list = (ListView) findViewById(R.id.mylist);
        //为ListView设置Adapter
        list.setAdapter(simpleAdapter);
        list.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(getApplicationContext(), "被点击了", Toast.LENGTH_SHORT).show();

            }

        });
        list.setOnItemSelectedListener(new OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(getApplicationContext(), "被选中了", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
                // TODO Auto-generated method stub

            }
        });

    }
}

真机效果如下:
这里写图片描述

使用SimpleAdapter需要五个参数,如下:
第一个参数(Context):它代表了访问整个Android应用的接口。几乎创建所有组件都需要传递进来Context对象。
第二个参数:该参数是一个类型的集合对象,该集合中每个Map对象生成一个列表项。
第三个参数:该参数指定一个界面布局的ID。
第四个参数:该参数是一个int[]类型的参数,该参数决定提取Map对象中哪些key对应的value来生成列表项。
第五个参数:该参数是一个int[]类型的参数,该参数决定填充哪些组件。

接下来我们继续学习,扩展BaseAdapter实现不存储列表项的ListView。扩展BaseView可以取得对Adapter最大的控制权。
activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >

    <ListView 
        android:id="@+id/myList"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></ListView>

</LinearLayout>

MainActivity.java

package com.example.baseadaptertest1;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity {

    private  ListView myList;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myList = (ListView) findViewById(R.id.myList);
        BaseAdapter adapter = new BaseAdapter() {

            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                //创建一个LinearLayout,并向其中添加两个组件
                LinearLayout line = new LinearLayout(MainActivity.this);
                line.setOrientation(0);
                ImageView image = new ImageView(MainActivity.this);
                image.setImageResource(R.drawable.ic_launcher);
                TextView text = new TextView(MainActivity.this);
                text.setText("第" + (position +1) + "个列表项");
                text.setTextSize(20);
                text.setTextColor(Color.RED);
                line.addView(text);
                //返回LinearLayout实例
                return line;
            }

            @Override
            public long getItemId(int position) {
                // TODO Auto-generated method stub
                return position;
            }

            @Override
            public Object getItem(int position) {
                // TODO Auto-generated method stub
                return null;
            }

            @Override
            public int getCount() {
                // 指定一共包含20项
                return 20;
            }
        };
        myList.setAdapter(adapter);
    }
}

真机效果如下:
这里写图片描述

该案例创建了一个BaseAdapter对象,扩展该对象需要重写如下四个方法:
getCount():该方法的返回值控制该Adapter将会包含多少个列表项。
getItem(int position):该方法的返回值决定第position处的列表项的内容。
getItemId(int position):该方法的返回值决定第position处的列表项的ID。
getView(int position, View convertView, ViewGroup parent):该方法的返回值决定第position处的列表项组件。
这里通过四种方法实现了Adapter。

Android开发笔记:Android控件之listview基础篇 1 系统自带item public class MainActivity extends ActionBarActivity { private ListView lv; private ArrayAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onC 阅读详情

相关推荐

SRS(简单实时视频服务) 笔记(5)- 视频录制

在SRS使用中实现视频录制功能。

irainsa的博客 1698

Android最常用的控件ListView(详解)

一.ListView简介 在Android开发中,ListView是一个比较常用的控件。它以列表的形式 展示具体数据内容,并且能够根据数据的长度自适应屏幕显示。 二.ListView简单用法 代码部分 1.布局界面 activity_main.xml 代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/ap...

indeedes的博客 8万+

Linux系统搭建OpenClaw(原Clawdbot)全流程指南 最新版

工具定位:开源个人 AI 助手,支持文件读取、命令执行、多渠道交互(Telegram / 本地终端等);系统要求:主流 Linux 发行版(Ubuntu/Debian/CentOS 等),Node.js ≥22(核心依赖);安全提示:OpenClaw 为测试版,具备高权限操作能力,建议使用非主力机,配置权限白名单,避免接触敏感数据。

AI时代老码农的第二春 6559

Android基础——ListView

ListViewListView是什么?纯列表ListViewListView定制使用 ListView是什么? ListView以列表的形式展现数据,用户可通过对屏幕的上下滑动加载数据。 纯列表ListView 在activity_main.xml中加入ListView: <ListView android:id="@+id/list_view" android:layout_width="match_parent" android:layout_he

松仔Log的博客 6040

FPGA:UART串口接收(高干扰情况)

在上一篇文章中介绍过UART串口接收模块,其中一个需要优化的方向就是在高干扰情况下,如何实现可靠的UART串口接收任务。

weixin_50164178的博客 1671

别再乱调栅极电阻了!手把手教你用示波器调试FOC驱动MOS管,避开EMC和震荡坑

本文详细介绍了FOC驱动中MOS管栅极参数的精准调试方法,涵盖示波器配置、波形特征分析及栅极电阻选型策略。通过实战案例和工程经验,帮助工程师有效解决EMC和震荡问题,提升驱动电路稳定性和效率。

weixin_28728495的博客 502

Android--ListView作用详解

1.ListView   ListView列表视图控件是Android中常用的控件之一,其直接继承了AbsListView,是一个以垂直方式在项目中显示View视图的列表。ListView的数据项,来自一个继承了ListAdapter接口的适配器。   ListView的常用属性一般就是用来设置列表的间隔、分割线、表头、表尾等属性的,常用属性有以下几个,并且Android也为其提供了对应的se...

streate的专栏 5705

用yolov8训练自己的模型并调取摄像头实时检测,新手小白超友好教程!逻辑梳理,从0开始逐步实操❤

帮新手小白学会用yolov8,包含多篇高质量博客整理

Lhhhhds的博客 2941

【Android从零单排系列二十】《Android视图控件——ListView》

小伙伴们,在上文中我们介绍了Android视图组件CheckBox,本文我们继续盘点,介绍一下视图控件的ListView。ListView是Android开发中常用的列表视图控件,用于展示垂直滚动的可变长度的数据列表。功能:ListView可以在有限的屏幕空间内显示大量的数据,并支持用户滚动浏览。它提供了一个可滚动的列表容器,可以逐项地展示数据元素。数据源:ListView通过与适配器(Adapter)配合使用来提供数据。适配器负责将数据与每个列表项进行绑定,以便正确渲染和展示。

商务合作|问题讨论|交流学习 请联系作者微信,加微信请务必注明来意,博客主页有联系方式 3601

基于Simulink的双向DC-DC变换器在储能系统中的应用仿真

摘要:本文详细介绍了基于Simulink的双向DC-DC变换器在光伏储能系统中的仿真实现。主要内容包括:1)采用非隔离型双向Buck-Boost拓扑作为储能系统枢纽;2)针对750V直流微网中的20kWh锂电池接口场景进行建模;3)详细阐述双闭环控制器设计(电压外环+电流内环)、工作模式判断逻辑等关键步骤;4)通过仿真验证了系统在功率阶跃和模式切换下的性能。文章提供了完整的建模流程和控制方法,为储能系统接口设计提供了实用参考。

amy_mhd的博客 178

[个人自用,全网最优]EDEM-FLUENT个人自学教程,拒绝手忙脚乱无用功!

[个人自用,全网最优]EDEM-FLUENT个人自学教程,拒绝手忙脚乱无用功!

zheaa的博客 4827

Android基础知识 - ListView

ListView

weixin_43636084的博客 4696

selenium绕过检测,规避检测

现在不少大网站有对selenium采取了监测机制。比如正常情况下我们用浏览器访问淘宝等网站的 window.navigator.webdriver的值为 undefined或者为false。而使用selenium访问则该值为true。那么如何解决这个问题呢?我们正常浏览器登录查看,window.navigator.webdriver的值为false我们通过selenium打开的网页,测试,可见window.navigator.webdriver的值为true。

景天科技苑 1万+

Android基础之ListView的使用详解

今天给大家带来《android应用开发全程实录》中关于listview和adatper中的部分。包括listview的基本使用,listview的优化等。 我们经常会在应用程序中使用列表的形式来展现一些内容,所以学好ListView是非常必需的。ListView也是Android中比较难以使用的控件,这节内容就将详细解读ListView的用法。 一个ListView通常有两个职责。 (1)将

HaiBing 3万+

计算机控制技术及应用

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

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

android基础--ListView 详解

1.简单的ListView        在List列表中如果不存在过于复杂的东西 我们可以直接去new ArrayAdapter() 来绘制列表,无须继承ArrayAdapter,重写它的方法。但是如果列表中过于复杂的话就需要使用自定义布局来实现List列表。 1 2 3 4 5 6 7 8 9 10 ...

学海无涯 909

IEM模型,地表粗糙度模拟

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

Android详细教程(基础篇):八、View组件高级篇:ListView详解

7.2. ListView (列表视图) 与滚动视图(ScrollView)类似的还有一种列表组件(ListView),可以将多个组件加入到ListView之中,以达到组件的 滚动显示效果,ListView组件本身也有对应的ListView类支持,可以通过操作ListView类以完成对此组件的操作。 列表的显示需要三个元素: 1.ListVeiw :用来展示列表的View,可以写在配置里...

二总的猫 522

Android 0基础从入门到精通

day01-android入门 day01-android介绍 day01-Android系统架构 day01-两种虚拟机的不同 day01-Android开发分类 day01-ART模式android_runtime day01-android开发环境的搭建 day01-第一个android项目 day01-Android程序打包过程 day01-Android程序启动过程 day01-A...

lcyaiym的专栏 410

11、Android ListView

Android ListView的简单用法及定制ListView界面 一、ListView的简单用法 2. 训练目标 掌握 ListView 控件的使用 掌握 Adapter 桥梁的作用 实现步骤: 1)首先新建一个项目, 并让ADT 自动帮我们创建好活动。然后修改activity_main.xml 中的代码,如下所示: 在布局中加入ListView 控件,并为ListView 指定了一个id 设置成match_parent 占满整个空间 2)在MainActivity 中 (1)、在这里我运用了

weixin_45808711的博客 252

Android ListView组件的使用

一、不使用xml布局文件创建一个ListView 创建一个名称为HelloListView的Android工程。 要使用ListView,需要让你的Activity继承于ListActivity,这个和以前的有区别,以前的都是继承Activity,该ListActivity继承Activity,扩展了很多常用的用于操作ListView的方法,使用很方便。 现修改HelloListView类如下...

mmdev 191

Android Studio——ListView

学习关于ListView的基本使用 书中例子: java: package com.example.test; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.ListView; public class MainActivity extends AppCompatActivity {

ziupan的博客 420

【Android开发】 ListView使用实战详解,你get到了嘛?

Android—— ListView 的用法 一、ListView的简单用法 Listview的基本XML属性 android:divider="#f00" 分割线的颜色 android:dividerHeight="2dp" 分割条的高度 android:cacheColorHint="#0fff" 当列表使用背景图之后,下拉或者上拉都会出现一个问题:背景图不见了 android:scrollingCache="false" ...

累计发表博客60余万字,优快云 博客专家、Java 领域优质创作者、华为云享专家、阿里云专家博主。专注分享 Java 优质文章,毕设实战项目开发,全网粉丝10W+ 7992

【android】ListView之BaseAdapter使用详解

android中ListView是一个比较常用的控件,它用于方便的列表显示可见数据,当数据过多时,会出现滚动条,并且可以根据屏幕长度进行自适应显示。

此成非彼诚博客 1万+

Android之ListView详解

在Android的应用开发过程中,总是需要将一系列的数据进行列表式展示。这个时候最常用到的控件就是ListView了,这个控件是很多Android初学者(包括笔者也是,很长时间之后才弄明白的)都感觉比较难掌握的。本文就来梳理一下有关ListView开发的点点滴滴,希望对于初学Android编程的朋友有帮助。一个原始而简单的例子首先,我们看下关于ListView的简单使用方式。我们现在想要在ListV

Android Fans 1万+

Android安卓开发基础-ListView

介绍安卓控件ListView在java文件及xml文件中的使用

weixin_53743049的博客 730

android ListView详解

在android开发中ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示。抽空把对ListView的使用做了整理,并写了个小例子,如下图。   列表的显示需要三个元素: 1.ListVeiw 用来展示列表的View。 2.适配器 用来把数据映射到ListView上的中介。 3.数据    具体的将被映射的字符串,图片,或者基本组件。 根据...

人生就是一种修行 1489
上一篇: [Unity3D]Unity3D自动寻路Demo
下一篇: [Android效果]Android中实现闪屏的欢迎界面
陶程
博客等级 码龄12年 360粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值