Android-RecycleView

本文主要是对RecycleView在使用时进行了一个封装,通过学习别人源码时觉得这种处理办法还不错,便增加上一个使用的方法,和添加XML解析,最后展现的一个例子。

1、处理RecyclerView.ViewHolder

package adapter;

import android.support.v7.widget.RecyclerView;
import android.view.View;

/**
 * Created by APICAL on 2016/10/18.
 */
public abstract class RecyclerViewHolderBasic extends RecyclerView.ViewHolder{

    public RecyclerViewHolderBasic(View itemView) {
        super(itemView);
    }

    protected abstract View getViewHolder();

}

2、处理RecyclerView.Adapter

package adapter;

import android.content.Context;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.View;
import android.view.ViewGroup;

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

/**
 * Created by APICAL on 2016/10/18.
 */
public abstract class RecycleViewAdapterBasic<T> extends RecyclerView.Adapter<RecyclerViewHolderBasic>{

    private List<T> resourceDataSetList;
    private View mHeaderView;

    private static final int TYPE_HEADER = 0x00000001;
    private static final int TYPE_NORMAL = 0x00000000;

    private OnViewHolderItemClickListener itemClickListener;


    public RecycleViewAdapterBasic(){
        this(null);
    }

    public RecycleViewAdapterBasic(Context context){
        resourceDataSetList = new ArrayList<>();
    }

    protected List<T> getResourceDataSetList(){
        return resourceDataSetList;
    }

    protected T getItemData(int position){
         return resourceDataSetList.get(position);
    }


    public abstract  void setResourceDataSetListAll(List<T> dataSetList);
    //{
    //    resourceDataSetList.addAll(dataSetList);
    //}

    public abstract void removeItemFromResourceDataSetList(int position);
    /*{
        resourceDataSetList.remove(position);
        notifyDataSetChanged();
    }*/

    public abstract  void removeItemFromResourceDataSetList(T item);
    /*{
        resourceDataSetList.remove(item);
        notifyDataSetChanged();
    }*/

    public void setHeaderViewToHolder(View headerView){
        mHeaderView = headerView;
        notifyItemInserted(0);
    }

    public View getHeaderViewFromHolder(){
        return mHeaderView;
    }



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

    @Override
    public int getItemViewType(int position) {
        //return super.getItemViewType(position);
        if (mHeaderView == null ) return  TYPE_NORMAL;
        if (position == 0) return TYPE_HEADER;
        return TYPE_NORMAL;
    }

    @Override
    public void onViewDetachedFromWindow(RecyclerViewHolderBasic holder) {
        super.onViewDetachedFromWindow(holder);
    }

    @Override
    public void onViewAttachedToWindow(RecyclerViewHolderBasic holder) {
    // onViewDetachedFromWindow 可见列表滑出window,但是滑出的不长
    // onViewAttachedToWindow 当列表项出现到可视界面的时候调用
        super.onViewAttachedToWindow(holder);
        ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();
        if(lp != null
                && lp instanceof StaggeredGridLayoutManager.LayoutParams
                && holder.getLayoutPosition() == 0) {
            StaggeredGridLayoutManager.LayoutParams p = (StaggeredGridLayoutManager.LayoutParams) lp;
            p.setFullSpan(true);
        }
    }

    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);

        RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
        if(manager instanceof GridLayoutManager) {
            final GridLayoutManager gridManager = ((GridLayoutManager) manager);
            gridManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
                @Override
                public int getSpanSize(int position) {
                    return getItemViewType(position) == TYPE_HEADER
                            ? gridManager.getSpanCount() : 1;
                }
            });
        }
    }

    @Override
    public void onDetachedFromRecyclerView(RecyclerView recyclerView) {
        super.onDetachedFromRecyclerView(recyclerView);
    }


    public static class HeaderViewHolder extends RecyclerViewHolderBasic {

        public HeaderViewHolder(View itemView) {
            super(itemView);
        }

        @Override
        protected View getViewHolder() {
            return null;
        }

    }


    @Override
    public RecyclerViewHolderBasic onCreateViewHolder(ViewGroup parent, int viewType) {
        if(mHeaderView != null && viewType == TYPE_HEADER) {
            return new HeaderViewHolder(mHeaderView);
        }
        return onCreateItemViewHolder(parent, viewType);
    }

    protected abstract RecyclerViewHolderBasic onCreateItemViewHolder(ViewGroup parent, int viewType);

    /**
     * 获得item的位置
     * @param holder
     * @return
     */
    public int getRealPosition(RecyclerViewHolderBasic holder) {
        int position = holder.getLayoutPosition();
        return mHeaderView == null ? position : position - 1;
    }


    @Override
    public void onBindViewHolder(RecyclerViewHolderBasic holder, int position) {
        /**如果是header view就直接返回,不需要绑定数据**/
        if(getItemViewType(position) == TYPE_HEADER) return;
        final int pos = getRealPosition(holder);
        final T data = resourceDataSetList.get(pos);
        bindDataToViewHolder(holder, position);

        if(itemClickListener != null) {
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    itemClickListener.OnViewHolderClick(pos, data);
                }
            });
        }
    }
    protected abstract void bindDataToViewHolder(RecyclerViewHolderBasic holder, int position);

    @Override
    public int getItemCount() {
        return mHeaderView == null ? resourceDataSetList.size() : resourceDataSetList.size() + 1;
    }


    public void setOnViewHolderItemClickListener(OnViewHolderItemClickListener listener) {
        itemClickListener = listener;
    }

    public interface OnViewHolderItemClickListener<T> {
        /**
         * item 点击事件接口
         * @param
         */
        void OnViewHolderClick(int position, T data);

    }

}

3、使用的具体适配器的实现:

package com.example.tangyd.tang_yd_recycleview;

import android.content.Context;
import android.graphics.Rect;
import android.support.v7.widget.RecyclerView;
import android.text.Layout;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.List;

import Modle.Persons;
import adapter.RecycleViewAdapterBasic;
import adapter.RecyclerViewHolderBasic;

/**
 * Created by APICAL on 2016/10/18.
 */
public class RecycleViewAdapter extends RecycleViewAdapterBasic<Persons.Person> {

    private Context mContext;
    private LayoutInflater mLayoutInflater;


    public RecycleViewAdapter(Context context) {
        super(context);
        this.mContext = context;
        this.mLayoutInflater = LayoutInflater.from(mContext);
    }

    @Override
    public void setResourceDataSetListAll(List<Persons.Person> dataSetList) {
        if (dataSetList != null) {
            getResourceDataSetList().addAll(dataSetList);
        }
        Log.v(this.getClass().getCanonicalName(), "Tang_YD | itemCount = " + getItemCount());
    }

    @Override
    public void removeItemFromResourceDataSetList(int position) {
        getResourceDataSetList().remove(position);
        notifyDataSetChanged();
    }

    @Override
    public void removeItemFromResourceDataSetList(Persons.Person item) {
        getResourceDataSetList().remove(item);
        notifyDataSetChanged();
    }


    @Override
    protected RecyclerViewHolderBasic onCreateItemViewHolder(ViewGroup parent, int viewType) {
        View containerView = mLayoutInflater.inflate(R.layout.view_holder_item, null, false);
        AdapterViewHolder viewHolder = new AdapterViewHolder(containerView);

        return viewHolder;
    }

    @Override
    protected void bindDataToViewHolder(RecyclerViewHolderBasic holder, int position) {

        AdapterViewHolder viewHolder = (AdapterViewHolder) holder;
        String _name = getItemData(position).getName();
        viewHolder.person_text_view.setText(_name);
    }

    public static final class SpaceItemDecoration extends RecyclerView.ItemDecoration{
        int _param;

        public SpaceItemDecoration(int param) {
            super();
            this._param = param;
        }

        @Override
        public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
            super.getItemOffsets(outRect, view, parent, state);
            if (parent.getChildAdapterPosition(view) != 0){
                outRect.left = _param;
                outRect.right = _param;
                outRect.top = _param;
                outRect.bottom = _param;
            }
        }
    }


    class AdapterViewHolder extends RecyclerViewHolderBasic{

        private View _layoutView;
        public TextView person_text_view;

        public AdapterViewHolder(View itemView) {
            super(itemView);
            _layoutView = itemView;
            person_text_view = (TextView) _layoutView.findViewById(R.id.person_text_view_ID);
        }

        @Override
        protected View getViewHolder() {
            return _layoutView;
        }
    }

}

4、于MainActivity调用:

package com.example.tangyd.tang_yd_recycleview;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.OrientationHelper;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;

import decode.ParsonParser;


public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {

    private RecyclerView recycler_view;
    private LinearLayoutManager mLinearLayoutManager;
    private RecycleViewAdapter adapter;

    private void setRecyclerView(){
        mLinearLayoutManager = new LinearLayoutManager(this);
        mLinearLayoutManager.setOrientation(OrientationHelper.VERTICAL);
        recycler_view.setLayoutManager(mLinearLayoutManager);
        recycler_view.setItemAnimator(new DefaultItemAnimator());
        adapter = new RecycleViewAdapter(this);
        ParsonParser _parsonParser = new ParsonParser(this, "workers.xml");
        adapter.setResourceDataSetListAll(_parsonParser.xmlParse());
        //设置item间距
        int spacingInPixels = getResources().getDimensionPixelSize(R.dimen.d_10dp);
        recycler_view.addItemDecoration(new RecycleViewAdapter.SpaceItemDecoration(spacingInPixels));
        recycler_view.setAdapter(adapter);
    }

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

        recycler_view = (RecyclerView) findViewById(R.id.recycler_view_ID);
        setRecyclerView();

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(toggle);
        toggle.syncState();

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);
    }



    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

        if (id == R.id.nav_camera) {
            // Handle the camera action
        } else if (id == R.id.nav_gallery) {

        } else if (id == R.id.nav_slideshow) {

        } else if (id == R.id.nav_manage) {

        } else if (id == R.id.nav_share) {

        } else if (id == R.id.nav_send) {

        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }
}

5、本例中使用到Person类:

package Modle;

import android.os.*;
import android.os.Parcel;
import android.util.Log;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;


import java.util.LinkedList;
import java.util.List;


/**
 * Created by APICAL on 2016/10/18.
 */
public class Persons {

    private static final String LOG_TAG = Persons.class.getSimpleName();

    private static final String TAGName = "workers";
    private static final String START_TAG = "worker";
    private static final String VAR0_TAG = "id";

    private static final String VAR1_TAG = "name";
    private static final String VAR2_TAG = "age";
    private static final String VAR3_TAG = "money";
    private static final String VAR4_TAG = "sex";
    private static final String VAR5_TAG = "status";

//<?xml version="1.0" encoding="UTF-8"?>
/**
<workers>
    <worker id="001">
         <name>zhangsan</name>
         <age>23</age>
         <money>4000</money>
         <sex>male</sex>
         <status>staff</status>
    </worker>
    <worker id="002">
         <name>lisi</name>
         <age>33</age>
         <money>8000</money>
         <sex>male</sex>
         <status>marketingManager</status>
    </worker>
    <worker id="003">
         <name>wangxiao</name>
         <age>29</age>
         <money>6000</money>
         <sex>female</sex>
         <status>administrativeAssistant</status>
    </worker>
</workers>
 */
    public class PersonsParse extends DefaultHandler {

        private List<Person> mPersonList;
        private Person mPerson;
        private String lineTagName;
        private StringBuffer mStringBuffer = new StringBuffer();
        private OnParseEndListener listener;

        public List<Person> getPersonList(){
            return mPersonList;
        }

        public void setOnParseEndListener(OnParseEndListener listener){
            this.listener = listener;
        }


        public PersonsParse() {
            super();
        }

        @Override
        public void startDocument() throws SAXException {
            super.startDocument();
            mPersonList = new LinkedList<>();
        }

        @Override
        public void endDocument() throws SAXException {
            super.endDocument();
            if (listener == null){
                return;
            }
            listener.onParseEnd(mPersonList);

        }

        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            super.characters(ch, start, length);
            if (lineTagName.equals(VAR1_TAG)){
                String _name = new String(ch, start, length).toString().trim();
                if (!_name.equals("")) {
                    mPerson.setName(_name);
                }
            }
            if (lineTagName.equals(VAR2_TAG)){
                String _age = new String(ch, start, length).toString().trim();
                if (!_age.equals("")) {
                    mPerson.setAge(Integer.parseInt(_age));
                }
            }
            if (lineTagName.equals(VAR3_TAG)){
                String _money = new String(ch, start, length).toString().trim();
                if (!_money.equals("")) {
                    mPerson.setMoney(Integer.parseInt(_money));
                }
            }
            if (lineTagName.equals(VAR4_TAG)){
                String _sex = new String(ch, start, length).toString().trim();
                if (!_sex.equals("")) {
                    mPerson.setSex(_sex);
                }
            }
            if (lineTagName.equals(VAR5_TAG)){
                String work = new String(ch, start, length).toString().trim();
            }
        }

        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
            super.startElement(uri, localName, qName, attributes);

            lineTagName = localName;
            Log.v(LOG_TAG + "." + this.getClass().getCanonicalName(), lineTagName + " / " + uri + " / " + qName + " / " +attributes);

            if (lineTagName.equals(START_TAG)){
                mPerson = new Person();
                int length = attributes.getLength();
                for (int i = 0; i < length; i++){
                    if (attributes.getLocalName(i).equals(VAR0_TAG)){
                        mPerson.setId(Integer.parseInt(attributes.getValue(i)));
                    }
                }

            }

        }

        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
            super.endElement(uri, localName, qName);
            if (qName.equals(START_TAG)){
                mPersonList.add(mPerson);
            }

        }
    }

    public interface OnParseEndListener{
        void onParseEnd( List<Person> list);
    }

    public static class Person implements Parcelable {
        private int id;
        private String name;
        private String sex;
        private int age;
        private int money;

        public int getMoney() {
            return money;
        }

        public void setMoney(int money) {
            this.money = money;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }

        public String getSex() {
            return sex;
        }

        public void setSex(String sex) {
            this.sex = sex;
        }

        public String getName() {
            return name;
        }

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

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public Person(){
            super();
        }

        public Person(int id, String name, String sex, int age, int money) {
            this.id = id;
            this.name = name;
            this.sex = sex;
            this.age = age;
            this.money = money;
        }

        protected Person(Parcel in) {
            id = in.readInt();
            name = in.readString();
            age = in.readInt();
            sex = in.readString();
            money = in.readInt();
        }

        public static final Creator<Person> CREATOR = new Creator<Person>() {
            @Override
            public Person createFromParcel(Parcel in) {
                return new Person(in);
            }

            @Override
            public Person[] newArray(int size) {
                return new Person[size];
            }
        };

        @Override
        public int describeContents() {
            return 0;
        }

        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeInt(id);
            dest.writeString(name);
            dest.writeString(sex);
            dest.writeInt(age);
            dest.writeInt(money);
        }
    }
}

6、对应的解析类基类:

package decode;

import android.content.Context;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

/**
 * Created by APICAL on 2016/10/19.
 */
public abstract class XmlParser<T> implements DecodeManager<T>{


    public String readerXmlByReader(Context context, String xmlName){
        String _variableContent = "";
        InputStream inputStream = null;
        try {
            inputStream = context.getAssets().open(xmlName);
        } catch (IOException e) {
            e.printStackTrace();
        }
        BufferedReader bufferedReader = null;
        FileInputStream fileInputStream = (FileInputStream) inputStream;
        //bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
        try {
            bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream, "utf-8"));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        String line;
        StringBuilder mStringBuilder = new StringBuilder();
        try {
            while ((line = bufferedReader.readLine()) != null){
                mStringBuilder.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                bufferedReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        _variableContent = mStringBuilder.toString();
        return _variableContent;
    }

    public String xmlReaderByStream(Context context, String xmlName){
        InputStream inputStream;
        String _xmlContent = "";
        BufferedInputStream bufferedInputStream = null;
        try {
            inputStream = context.getAssets().open(xmlName);//("workers.xml");
            bufferedInputStream = new BufferedInputStream(inputStream);
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            int line;
            byte[] mByte = new byte[1024 * 1024];
            while((line = bufferedInputStream.read(mByte)) != -1) {
                byteArrayOutputStream.write(mByte, 0, line);
            }
            _xmlContent = byteArrayOutputStream.toString();

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                bufferedInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return _xmlContent;
    }

    public String xmlParser(InputStream inputStream){
        String _variableContent = "";
        BufferedInputStream mBufferedInputStream = new BufferedInputStream(inputStream);
        byte[] mByte = new byte[1024 * 1024];
        int line;
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        try {
            while ((line = mBufferedInputStream.read(mByte)) != -1){
                outputStream.write(mByte, 0, line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                mBufferedInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        _variableContent = outputStream.toString();
        return _variableContent;
    }

}

7、DecodeManager接口:

package decode;

/**
 * Created by APICAL on 2016/10/19.
 */
public interface DecodeManager<T> {
     T xmlParse();
}

8、具体的解析类:

package decode;

import android.content.Context;
import android.util.Log;

import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;

import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;

import Modle.Persons;

/**
 * Created by APICAL on 2016/10/19.
 */
public class ParsonParser extends XmlParser<List>{

    private String xmlName;
    private Context context;

    public ParsonParser(Context context, String xmlName){
        this.context = context;
        this.xmlName = xmlName;
    }



    @Override
    public List xmlParse() {
        final List<Persons.Person> personList = new ArrayList<>();
        Persons _persons = new Persons();
        Persons.PersonsParse _personsParse = _persons.new PersonsParse();
        _personsParse.setOnParseEndListener(new Persons.OnParseEndListener() {
            @Override
            public void onParseEnd(java.util.List<Persons.Person> list) {
                personList.addAll(list);
            }
        });
        String _VariableContent = xmlReaderByStream(context, xmlName);
        SAXParserFactory _factory = SAXParserFactory.newInstance();
        try {
            XMLReader _xmlReader = _factory.newSAXParser().getXMLReader();
            _xmlReader.setContentHandler(_personsParse);// 设置解析内容
            try {
                _xmlReader.parse(new InputSource(new StringReader(_VariableContent)));// 开始解析
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        }

        Log.v(this.getClass().getSimpleName(), "Tang_YD" + "\n" + personList.size());

        if (personList.isEmpty()){
            return null;
        }
        return personList;
    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值