Android 之路33---ListView控件

导读

1.ListView的简单实现
2.获取系统已经安装的应用列表
3.ListView与网络请求结合案例
4.ListView拓展
5.BaseAdapter基础

ListView的简单实现

这里写图片描述

适配器是用来将ListView视图与数据匹配起来的工具

这里写图片描述

主页面布局文件 activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

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


</LinearLayout>

自定义item文件 item_layout

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

    <ImageView
        android:id="@+id/iv"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:src="@drawable/timg"
        />

    <TextView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:paddingLeft="6dp"
        android:textSize="20sp"
        android:gravity="center_vertical"/>

</LinearLayout>

java文件 MainActivity.java

package com.hala.view01;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;


public class MainActivity extends Activity {


    private ListView lv;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        lv = (ListView)findViewById(R.id.lv);

        List<String> appNames=new ArrayList<>();

        appNames.add("知乎");
        appNames.add("网易公开课");
        appNames.add("微信");

        //将主页面的ListView与自定义item布局的绑定
        lv.setAdapter(new AppListAdapter(appNames));
    }

    public class AppListAdapter extends BaseAdapter{

        List<String> mApp;

        public AppListAdapter(List<String> appNames) {
            mApp=appNames;
        }

        /**
         *
         * @return 一共有多少条数据
         */
        @Override
        public int getCount() {
            return mApp.size();
        }

        /**
         *
         * @param position 当前位置
         * @return 返回当前position的数据
         */
        @Override
        public Object getItem(int position) {
            return mApp.get(position);
        }

        /**
         *
         * @param position 当前位置
         * @return 返回当前position的id
         */
        @Override
        public long getItemId(int position) {
            return position;
        }

        /**
         *处理view---data匹配过程
         * @param position 当前位置
         * @param convertView
         * @param parent
         * @return
         */
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            //借用LayoutInflater来处理,并拿到自定义的每一个item的布局
            LayoutInflater layoutInflater=(LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView=layoutInflater.inflate(R.layout.item_layout,null);

            ImageView imageView=(ImageView)convertView.findViewById(R.id.iv);
            TextView textView=(TextView)convertView.findViewById(R.id.tv);

            textView.setText(mApp.get(position));

            return convertView;
        }
    }


}

显示结果

这里写图片描述

获取系统已经安装的应用列表

主页布局文件 activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

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


</LinearLayout>

自定义headerView布局文件 headerview_layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="240dp"
        android:background="@drawable/conan"/>

</LinearLayout>

java文件 MainActivity.java

package com.hala.view01;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ComponentInfo;
import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;


public class MainActivity extends Activity {


    private ListView lv;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        lv = (ListView)findViewById(R.id.lv);

        //将主页面的ListView与获取的手机信息绑定
        lv.setAdapter(new AppListAdapter(getAppInfos()));

        //ListView的HeaderView属性
        /*
        这里实现的效果是顶部图片会随着滑动而动
        如果要求顶部图片不动,可以在ListView上边加一个ImageView
         */
        LayoutInflater layoutInflater=(LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View headerView=layoutInflater.inflate(R.layout.headerview_layout,null);
        lv.addHeaderView(headerView);
    }

    /**
     * 获取用户的所有应用信息
     * @return
     */
    private List<ResolveInfo> getAppInfos(){
        Intent intent=new Intent(Intent.ACTION_MAIN,null);
        intent.addCategory(Intent.CATEGORY_LAUNCHER);
        return getPackageManager().queryIntentActivities(intent,0);
    }

    public class AppListAdapter extends BaseAdapter{

        List<ResolveInfo> mApp;

        public AppListAdapter(List<ResolveInfo> appNames) {
            mApp=appNames;
        }

        /**
         *
         * @return 一共有多少条数据
         */
        @Override
        public int getCount() {
            return mApp.size();
        }

        /**
         *
         * @param position 当前位置
         * @return 返回当前position的数据
         */
        @Override
        public Object getItem(int position) {
            return mApp.get(position);
        }

        /**
         *
         * @param position 当前位置
         * @return 返回当前position的id
         */
        @Override
        public long getItemId(int position) {
            return position;
        }

        /**
         *处理view---data匹配过程
         * @param position 当前位置
         * @param convertView
         * @param parent
         * @return
         */
        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {

            //借用LayoutInflater来处理,并拿到自定义的每一个item的布局
            LayoutInflater layoutInflater=(LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView=layoutInflater.inflate(R.layout.item_layout,null);

            ImageView imageView=(ImageView)convertView.findViewById(R.id.iv);
            TextView textView=(TextView)convertView.findViewById(R.id.tv);

            //将app的图标以及标题添加到自定义布局上
            textView.setText(mApp.get(position).activityInfo.loadLabel(getPackageManager()));
            imageView.setImageDrawable(mApp.get(position).activityInfo.loadIcon(getPackageManager()));

            //通过点击app名称实现跳转,实际上是为TextView设置了点击事件
            textView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //设置点击事件以实现跳转的效果
                    String packageName=mApp.get(position).activityInfo.packageName;
                    String className=mApp.get(position).activityInfo.name;

                    ComponentName componentName=new ComponentName(packageName,className);

                    Intent intent = new Intent();
                    intent.setComponent(componentName);
                    startActivity(intent);
                }
            });


            return convertView;
        }
    }


}

显示结果

这里写图片描述

第二种点击事件写法(其他文件相同)

java文件

package com.hala.view01;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ComponentInfo;
import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;


public class MainActivity extends Activity {


    private ListView lv;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        lv = (ListView)findViewById(R.id.lv);

        //将主页面的ListView与获取的手机信息绑定
        final List<ResolveInfo> appInfos = getAppInfos();
        lv.setAdapter(new AppListAdapter(appInfos));

        //ListView的HeaderView属性
        /*
        这里实现的效果是顶部图片会随着滑动而动
        如果要求顶部图片不动,可以在ListView上边加一个ImageView
         */
        LayoutInflater layoutInflater=(LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View headerView=layoutInflater.inflate(R.layout.headerview_layout,null);
        lv.addHeaderView(headerView);


        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                //设置点击事件以实现跳转的效果
                //这种方法是针对整个item设置的点击事件
                String packageName=appInfos.get(position).activityInfo.packageName;
                String className=appInfos.get(position).activityInfo.name;

                ComponentName componentName=new ComponentName(packageName,className);

                Intent intent = new Intent();
                intent.setComponent(componentName);
                startActivity(intent);

            }
        });
    }

    /**
     * 获取用户的所有应用信息
     * @return
     */
    private List<ResolveInfo> getAppInfos(){
        Intent intent=new Intent(Intent.ACTION_MAIN,null);
        intent.addCategory(Intent.CATEGORY_LAUNCHER);
        return getPackageManager().queryIntentActivities(intent,0);
    }

    public class AppListAdapter extends BaseAdapter{

        List<ResolveInfo> mApp;

        public AppListAdapter(List<ResolveInfo> appNames) {
            mApp=appNames;
        }

        /**
         *
         * @return 一共有多少条数据
         */
        @Override
        public int getCount() {
            return mApp.size();
        }

        /**
         *
         * @param position 当前位置
         * @return 返回当前position的数据
         */
        @Override
        public Object getItem(int position) {
            return mApp.get(position);
        }

        /**
         *
         * @param position 当前位置
         * @return 返回当前position的id
         */
        @Override
        public long getItemId(int position) {
            return position;
        }

        /**
         *处理view---data匹配过程
         * @param position 当前位置
         * @param convertView
         * @param parent
         * @return
         */
        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {

            //借用LayoutInflater来处理,并拿到自定义的每一个item的布局
            LayoutInflater layoutInflater=(LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView=layoutInflater.inflate(R.layout.item_layout,null);

            ImageView imageView=(ImageView)convertView.findViewById(R.id.iv);
            TextView textView=(TextView)convertView.findViewById(R.id.tv);

            //将app的图标以及标题添加到自定义布局上
            textView.setText(mApp.get(position).activityInfo.loadLabel(getPackageManager()));
            imageView.setImageDrawable(mApp.get(position).activityInfo.loadIcon(getPackageManager()));

            return convertView;
        }
    }


}

ListView的优化处理(其他文件相同)

package com.hala.view01;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ComponentInfo;
import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;


public class MainActivity extends Activity {


    private ListView lv;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        lv = (ListView)findViewById(R.id.lv);

        //将主页面的ListView与获取的手机信息绑定
        final List<ResolveInfo> appInfos = getAppInfos();
        lv.setAdapter(new AppListAdapter(appInfos));

        //ListView的HeaderView属性
        /*
        这里实现的效果是顶部图片会随着滑动而动
        如果要求顶部图片不动,可以在ListView上边加一个ImageView
         */
        LayoutInflater layoutInflater=(LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View headerView=layoutInflater.inflate(R.layout.headerview_layout,null);
        lv.addHeaderView(headerView);


        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                //设置点击事件以实现跳转的效果
                //这种方法是针对整个item设置的点击事件
                String packageName=appInfos.get(position).activityInfo.packageName;
                String className=appInfos.get(position).activityInfo.name;

                ComponentName componentName=new ComponentName(packageName,className);

                Intent intent = new Intent();
                intent.setComponent(componentName);
                startActivity(intent);

            }
        });
    }

    /**
     * 获取用户的所有应用信息
     * @return
     */
    private List<ResolveInfo> getAppInfos(){
        Intent intent=new Intent(Intent.ACTION_MAIN,null);
        intent.addCategory(Intent.CATEGORY_LAUNCHER);
        return getPackageManager().queryIntentActivities(intent,0);
    }

    public class AppListAdapter extends BaseAdapter{

        List<ResolveInfo> mApp;

        public AppListAdapter(List<ResolveInfo> appNames) {
            mApp=appNames;
        }

        /**
         *
         * @return 一共有多少条数据
         */
        @Override
        public int getCount() {
            return mApp.size();
        }

        /**
         *
         * @param position 当前位置
         * @return 返回当前position的数据
         */
        @Override
        public Object getItem(int position) {
            return mApp.get(position);
        }

        /**
         *
         * @param position 当前位置
         * @return 返回当前position的id
         */
        @Override
        public long getItemId(int position) {
            return position;
        }

        /**
         *处理view---data匹配过程
         * @param position 当前位置
         * @param convertView
         * @param parent
         * @return
         */
        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {

            ViewHolder viewHolder=new ViewHolder();

            /*
            这里的优化之处在于:
            只有在convertView为空时,才去借用LayoutInflater去调用布局
            如果之前已经调用过了,就不在调用而是执行else的操作,这样大大提高了效率
             */
            if(convertView==null) {
                //借用LayoutInflater来处理,并拿到自定义的每一个item的布局
                LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = layoutInflater.inflate(R.layout.item_layout, null);

                viewHolder.imageView = (ImageView) convertView.findViewById(R.id.iv);
                viewHolder.textView = (TextView) convertView.findViewById(R.id.tv);

                convertView.setTag(viewHolder);

            }else {
                viewHolder=(ViewHolder)convertView.getTag();
            }
            //将app的图标以及标题添加到自定义布局上
            viewHolder.textView.setText(mApp.get(position).activityInfo.loadLabel(getPackageManager()));
            viewHolder.imageView.setImageDrawable(mApp.get(position).activityInfo.loadIcon(getPackageManager()));

            return convertView;
        }
    }

    //用于优化ListView
    public class ViewHolder{
        public ImageView imageView;
        public TextView textView;
    }


}

ListView与网络请求结合案例

配置文件 Manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.hala.view01">


    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

主页布局文件 activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

  <ImageView
      android:layout_width="match_parent"
      android:layout_height="200dp"
      android:background="@drawable/clarke"/>

  <ListView
      android:id="@+id/lv"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:background="@color/white"></ListView>


</LinearLayout>

每一项ListView的布局文件 item_layout.xml

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

    <ImageView
        android:id="@+id/iv"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:src="@drawable/timg"
        />

    <TextView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:paddingLeft="6dp"
        android:textSize="20sp"
        android:lines="1"
        android:gravity="center_vertical" />

</LinearLayout>

添加在ListView底部图片的布局文件 headerview_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="240dp"
        android:background="@drawable/conan"/>

</LinearLayout>

自定义Adapter文件 RequestDataAdapter.java

package com.hala.view01;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by air on 2018/2/8.
 */

public class RequestDataAdapter extends BaseAdapter{

    private List<LessonResult.LessonInfo> mlessonInfo=new ArrayList<>();
    private Context mcontext;

    /**
     *
     * @param context 上下文
     * @param infos 数据
     */
    public RequestDataAdapter(Context context,List<LessonResult.LessonInfo> infos) {
        mlessonInfo=infos;
        mcontext=context;
    }

    @Override
    public int getCount() {
        return mlessonInfo.size();
    }

    @Override
    public Object getItem(int position) {
        return mlessonInfo.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder=new ViewHolder();

        if(convertView==null){
            LayoutInflater layoutInflater=(LayoutInflater)mcontext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView=layoutInflater.inflate(R.layout.item_layout,null);
            viewHolder.imageView=(ImageView)convertView.findViewById(R.id.iv);
            viewHolder.textView=(TextView)convertView.findViewById(R.id.tv);
            convertView.setTag(viewHolder);

        }else {
            viewHolder=(ViewHolder)convertView.getTag();
        }

        viewHolder.textView.setText(mlessonInfo.get(position).getName());
        //设置图像为不可见
        //注意GONE是消失的意思,图像将不在绘制,而INVISIBLE只是不可见,但仍然占据一块地方
        viewHolder.imageView.setVisibility(View.GONE);

        return convertView;
    }

    class ViewHolder {
        public ImageView imageView;
        public TextView textView;
    }
}

主页面java文件 MainActivity.java

package com.hala.view01;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ComponentInfo;
import android.content.pm.ResolveInfo;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;


public class MainActivity extends Activity {


    public static final String STATUS = "status";
    public static final String MSG = "msg";
    public static final String DATA = "data";
    public static final String NAME = "name";
    public static final String REQUEST_URL = "http://www.imooc.com/api/teacher?type=2&page=1";
    private ListView listView;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listView = (ListView)findViewById(R.id.lv);

        LayoutInflater layoutInflater=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View footerView=layoutInflater.inflate(R.layout.headerview_layout,null);
        listView.addFooterView(footerView);


        new RequestDataAsyncTask().execute();
    }

    public class RequestDataAsyncTask extends AsyncTask<Void,Void,String>{

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected String doInBackground(Void... params) {

            return request(REQUEST_URL);
        }

        /**
         * 从网络请求数据,在另一个线程中进行
         * @param s
         * @return
         */
        private String request(String s) {

            try {
                URL url=new URL(s);
                HttpURLConnection connection=(HttpURLConnection)url.openConnection();

                connection.setConnectTimeout(30000);
                connection.setRequestMethod("GET");
                connection.connect();

                int requestCode=connection.getResponseCode();

                if(requestCode==HttpURLConnection.HTTP_OK){

                    InputStreamReader inputStream=new InputStreamReader(connection.getInputStream());
                    BufferedReader bufferReader=new BufferedReader(inputStream);
                    StringBuilder stringBuilder=new StringBuilder();

                    String line;
                    if((line=bufferReader.readLine())!=null){
                        stringBuilder.append(line);
                    }

                    return stringBuilder.toString();
                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);

            LessonResult lessonResult=new LessonResult();

            try {
                JSONObject json=new JSONObject(s);
                int status = json.getInt(STATUS);
                lessonResult.setStatus(status);
                String msg = json.getString(MSG);
                lessonResult.setMsg(msg);

                List<LessonResult.LessonInfo> lessonInfos=new ArrayList<>();
                JSONArray dataArray=json.getJSONArray(DATA);

                for(int i=0;i<dataArray.length();i++){
                    LessonResult.LessonInfo lessonInfo=new LessonResult.LessonInfo();
                    JSONObject temp=(JSONObject)dataArray.get(i);
                    String name = temp.getString(NAME);
                    lessonInfo.setName(name);

                    lessonInfos.add(lessonInfo);
                }

                lessonResult.setData(lessonInfos);

            } catch (JSONException e) {
                e.printStackTrace();
            }

            listView.setAdapter(new RequestDataAdapter(MainActivity.this,lessonResult.getData()));
        }
    }

}

显示结果
这里写图片描述

ListView拓展

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

BaseAdapter基础

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值