zxyue

本文深入探讨了Android应用开发中常用的基类框架(BaseFragmentActivity, BaseFragment), Handler倒计时实现, Fragment与Activity交互,以及自定义适配器、网格视图、PullToRefreshListView等组件的使用技巧。

1.BaseFragmentActivity

public abstract class BaseFragmentActivity extends FragmentActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(initLayout());
        initView();
        initData();
    }

    protected abstract int initLayout();

    protected abstract void initView();

    protected abstract void initData();

    //findViewByid
    protected <T extends View> T fvd (int resId){
        return findViewById(resId);
    }

}

2.BaseFragment

public abstract class BaseFragment extends Fragment {

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(initLayout(),container,false);
        return view;
    }

    protected abstract int initLayout();


    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        ininView();
    }

    protected abstract void ininView();

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        initData();
    }

    protected abstract void initData();

    //findViewById
    protected <T extends View> T fvd (int resId){
        return (T) getView().findViewById(resId);
    }
}

3.0Handler,倒计时,无判断

public class MainActivity extends BaseFragmentActivity {

    private TextView miao;
    private int miaoshu = 3;

    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if(miaoshu==0){
                Intent intent = new Intent(MainActivity.this,Main2Activity.class);
                startActivity(intent);
                finish();
            }else{
                miao.setText(miaoshu+"秒");
                miaoshu--;
                handler.sendEmptyMessageDelayed(0,1000);
            }
        }
    };

    //布局
    @Override
    protected int initLayout() {
        return R.layout.activity_main;
    }

    //控件
    @Override
    protected void initView() {
        miao = fvd(R.id.miao);
    }

    //数据
    @Override
    protected void initData() {
        handler.sendEmptyMessage(0);
    }
}

3.Handler,倒计时

public class MainActivity extends BaseFragmentActivity{

    private TextView miao;
    private SharedPreferences sp;
    private int time = 3;

    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what == 0){
                 if (time>0){
                     time--;
                     miao.setText(time+"s");
                     handler.sendEmptyMessageDelayed(0,1000);
                 }else{
                     //存值
                     sp.edit().putBoolean("flag",true).commit();
                     Intent intent = new Intent(MainActivity.this, Main2Activity.class);
                     startActivity(intent);
                     handler.removeCallbacksAndMessages(null);
                     finish();
                 }
            }
        }
    };

    @Override
    protected int initLayout() {
        return R.layout.activity_main;
    }

    @Override
    protected void initView() {
        miao = fvd(R.id.miao);
    }

    @Override
    protected void initData() {
        sp = getSharedPreferences("key",MODE_PRIVATE);
        boolean flag = sp.getBoolean("flag", false);
        if (flag){
            Intent intent = new Intent(MainActivity.this, Main2Activity.class);
            startActivity(intent);
            finish();
        }else{
            handler.sendEmptyMessageDelayed(0,1000);
        }
    }
}

4.BaseFragmentActivity, Fragment

public class Main2Activity extends BaseFragmentActivity{

    private FrameLayout layout;
    private RadioGroup radioGroup;
    private DrawerLayout draw;
    private FragmentOne fragmentOne;
    private FragmentTwo fragmentTwo;
    private String picUrl = "https://ws1.sinaimg.cn/large/0065oQSqly1g04lsmmadlj31221vowz7.jpg";
    private ImageView imagedraw;

    @Override
    protected int initLayout() {
        return R.layout.activity_main2;
    }

    @Override
    protected void initView() {
        layout = fvd(R.id.layout);
        radioGroup = fvd(R.id.radioGroup);
        draw = fvd(R.id.draw);
        imagedraw = fvd(R.id.imagedraw);
    }

    @Override
    protected void initData() {

        draw.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);

        Glide.with(this).load(picUrl).into(imagedraw);

        final FragmentManager fragmentManager = getSupportFragmentManager();

        fragmentOne = new FragmentOne();
        fragmentTwo = new FragmentTwo();

        fragmentManager.beginTransaction()
                .add(R.id.layout,fragmentOne)
                .add(R.id.layout,fragmentTwo)
                .show(fragmentOne)
                .hide(fragmentTwo)
                .commit();

        radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {

            private FragmentTransaction transaction;

            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                transaction = fragmentManager.beginTransaction();
                switch (checkedId){
                    case R.id.radioButton1:
                        transaction.show(fragmentOne)
                                .hide(fragmentTwo);
                        break;
                        case R.id.radioButton2:
                            transaction.show(fragmentTwo)
                                    .hide(fragmentOne);
                            break;
                            default:
                                break;
                }
                transaction.commit();
            }
        });
    }
}

5.Fragment布局

<android.support.v4.widget.DrawerLayout 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=".base.Main2Activity"
    android:id="@+id/draw"
    >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        >

        <FrameLayout
            android:id="@+id/layout"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="9"
            ></FrameLayout>

        <RadioGroup
            android:id="@+id/radioGroup"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:gravity="center"
            android:orientation="horizontal"
            >

            <RadioButton
                android:id="@+id/radioButton1"
                android:text="我的"
                android:button="@null"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center"
                />

            <RadioButton
                android:id="@+id/radioButton2"
                android:text="信息"
                android:button="@null"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center"
                />
        </RadioGroup>
    </LinearLayout>

    <LinearLayout
        android:layout_width="300dp"
        android:layout_height="match_parent"
        android:layout_gravity="left"
        android:background="#ccc"
        android:gravity="center_horizontal"
        android:orientation="vertical"
        >
        <ImageView
            android:id="@+id/imagedraw"
            android:layout_width="100dp"
            android:layout_height="100dp"
            />
    </LinearLayout>
</android.support.v4.widget.DrawerLayout>

6.FragmentOne

public class FragmentOne extends BaseFragment {

    private List<Fragment> list = new ArrayList<Fragment>();
    private TabLayout tabLayout;
    private ImageView pd;
    private ViewPager pager;
    private ArrayList<String> data1;
    private TabAdter tabAdter;

    @Override
    protected int initLayout() {
        return R.layout.fragmentone;
    }

    @Override
    protected void ininView() {
        tabLayout = fvd(R.id.tabLayout);
        pd = fvd(R.id.pd);
        pager = fvd(R.id.pager);
    }

    @Override
    protected void initData() {
        list.add(new Tabfrag1());
        list.add(new Tabfrag2());
        data1 = new ArrayList<String>();
        data1.add("新闻");
        data1.add("今日话题");

        //适配器
        tabAdter = new TabAdter(getChildFragmentManager(), data1, list);
        pager.setAdapter(tabAdter);

        //关联
        tabLayout.setupWithViewPager(pager);

        //频道管理,图片带值跳转
        pd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getActivity(),PdActivity.class);
                intent.putStringArrayListExtra("keyy",data1);
                startActivityForResult(intent,100);
            }
        });
    }

    //接受回传的值
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode==100&&resultCode==200){
            ArrayList<String> newTab = data.getStringArrayListExtra("keyy");
            //清楚所有数据
            list.clear();
            data1.clear();
            tabLayout.removeAllTabs();
            //重新添加数据
            data1.addAll(newTab);
            for (int i = 0; i < data1.size() ; i++) {
                TabLayout.Tab tab = tabLayout.newTab();
                tab.setText(data1.get(i));
                tabLayout.addTab(tab);

                if(i==0){
                    list.add(new FragmentOne());
                }else if(i==1){
                    list.add(new FragmentTwo());
                }
            }
            //刷新适配器
            tabAdter.notifyDataSetChanged();
            //重新关联
            tabLayout.setupWithViewPager(pager);
        }
    }
}

7.FragmentOne布局

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

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        >

        <android.support.design.widget.TabLayout
            android:id="@+id/tabLayout"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            ></android.support.design.widget.TabLayout>

        <ImageView
            android:id="@+id/pd"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:background="@drawable/ic_launcher_background"
            />

    </LinearLayout>

    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        ></android.support.v4.view.ViewPager>

</LinearLayout>

8FragmentOne适配器

public class TabAdter extends FragmentPagerAdapter {

    private ArrayList<String> data;
    private List<Fragment> list;

    public TabAdter(FragmentManager fm, ArrayList<String> data, List<Fragment> list) {
        super(fm);
        this.data = data;
        this.list = list;
    }

    @Override
    public Fragment getItem(int i) {
        return list.get(i);
    }

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

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return data.get(position);
    }
}

9.频道管理

public class FragmentTwo extends BaseFragment {

    private Grid2Adter gridAdter;
    private Grid2Adter gridAdter1;
    private GridView grid_top;
    private GridView grid_bottom;
    private TextView wan2;
    private ImageView fan2;
    private List<String> tops = new ArrayList<String>();
    private List<String> bottoms = new ArrayList<String>();

    @Override
    protected int initLayout() {
        return R.layout.fragmenttwo;
    }

    @Override
    protected void ininView() {
        wan2 = fvd(R.id.wan2);
        fan2 = fvd(R.id.fan2);
        grid_top = fvd(R.id.grid_top);
        grid_bottom = fvd(R.id.grid_bottom);
    }

    @Override
    protected void initData() {
        //模拟数据
        initDatae();

        gridAdter = new Grid2Adter(tops,getActivity());
        grid_top.setAdapter(gridAdter);

        gridAdter1 = new Grid2Adter(bottoms,getActivity());
        grid_bottom.setAdapter(gridAdter1);
        //添加上方条目监听
        grid_top.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                //添加到下方集合
                bottoms.add(tops.get(position));
                //先从上方集合删除
                tops.remove(position);
                //刷新适配器
                gridAdter.notifyDataSetChanged();
                gridAdter1.notifyDataSetChanged();
            }
        });
        //添加下方条目监听
        grid_bottom.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                //添加到下方集合
                tops.add(bottoms.get(position));
                //先从上方集合删除
                bottoms.remove(position);
                //刷新适配器
                gridAdter.notifyDataSetChanged();
                gridAdter1.notifyDataSetChanged();
            }
        });
    }

    private void initDatae() {
        tops.add("新闻");
        tops.add("热点");
        tops.add("视频");
        tops.add("两会");
        tops.add("北京");
        tops.add("娱乐");
        tops.add("图片");
        tops.add("社会");
        tops.add("新时代");
        bottoms.add("电影");
        bottoms.add("动漫");
        bottoms.add("财经");
        bottoms.add("国际");
        bottoms.add("美食");
        bottoms.add("文化");
    }
}

10.频道管理布局

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

   <RelativeLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content">

       <ImageView
           android:id="@+id/fan2"
           android:layout_width="50dp"
           android:layout_height="50dp"
           android:layout_marginLeft="300dp"
           android:background="@drawable/fanhui"
           />

       <TextView
           android:id="@+id/wan2"
           android:text="完成"
           android:background="@drawable/my_stroke"
           android:layout_width="50dp"
           android:layout_height="50dp"
           android:gravity="center"
           />

   </RelativeLayout>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="5dp"
        android:text="切换的栏目"
        />

    <GridView
        android:id="@+id/grid_top"
        android:numColumns="5"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        ></GridView>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="5dp"
        android:text="更多的栏目"
        />

    <GridView
        android:id="@+id/grid_bottom"
        android:numColumns="5"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        ></GridView>

</LinearLayout>

11.频道管理适配器

  private List<String> data;
    private Context context;

    public Grid2Adter(List<String> data, Context context) {
        this.data = data;
        this.context = context;
    }

12.PullToRefreshListView

public class Tabfrag1 extends BaseFragment {

    private String url = "http://172.17.8.100/movieApi/movie/v1/findHotMovieList?page=1&&count=10";
    private int pager = 1;
    private List<JsonBeanp.ResultBean> resultData = new ArrayList<JsonBeanp.ResultBean>();
    private List<String> data = new ArrayList<String>();
    private PullToRefreshListView pull_list;
    private Banner banner;
    private PulldAdter pulldAdter;
    private Dao dao;

    @Override
    protected int initLayout() {
        return R.layout.tabfrag1;
    }

    @Override
    protected void ininView() {
        pull_list = fvd(R.id.pull_list);
        banner = fvd(R.id.banner);
    }

    @Override
    protected void initData() {
        data.add("http://ww4.sinaimg.cn/large/006uZZy8jw1faic21363tj30ci08ct96.jpg");
        data.add("http://ww4.sinaimg.cn/large/006uZZy8jw1faic259ohaj30ci08c74r.jpg");
        data.add("http://ww4.sinaimg.cn/large/006uZZy8jw1faic2b16zuj30ci08cwf4.jpg");
        data.add("http://ww4.sinaimg.cn/large/006uZZy8jw1faic2e7vsaj30ci08cglz.jpg");

        banner.setImageLoader(new ImageLoader() {
            @Override
            public void displayImage(Context context, Object path, ImageView imageView) {
                Glide.with(getActivity()).load(path).into(imageView);
            }
        });
        banner.setDelayTime(2000);
        banner.setImages(data);
        banner.start();

        dao = new Dao(getActivity());
        //设置上拉下拉
        pull_list.setMode(PullToRefreshListView.Mode.BOTH);
        //设置刷新时可以滚动
        pull_list.setScrollingWhileRefreshingEnabled(true);
        //适配器
        pulldAdter = new PulldAdter(resultData, getActivity());
        pull_list.setAdapter(pulldAdter);
        //加载数据
        myData(pager);
        //监听
        pull_list.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {
            @Override
            public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {
               resultData.clear();
               myData(pager);
            }

            @Override
            public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {
               pager++;
               myData(pager);
            }
        });

    }

    private void myData(int p) {
        final String murl = url+p;
        if (Http.isABoolean(getActivity())){
            Http.MyAsTack(murl, new Http.CallBack() {
                @Override
                public void getData(String ss) {
                    jiexi(ss);
                    //添加数据库
                    dao.insertData(murl,ss);
                }
            });
        }else{
            Toast.makeText(getActivity(),"网络断开",Toast.LENGTH_LONG).show();
            //查询数据库
            String sa = dao.quertData(murl);
            jiexi(sa);
        }
    }

    //解析
    private void jiexi(String ss) {
        Gson gson = new Gson();
        JsonBeanp jsonBeanp = gson.fromJson(ss, JsonBeanp.class);
        List<JsonBeanp.ResultBean> result = jsonBeanp.getResult();
        resultData.addAll(result);
        pulldAdter.notifyDataSetChanged();
        pull_list.onRefreshComplete();
    }
}

13.List

public class Tabfrag2 extends BaseFragment {

    private List<JsonBeanl.ResultBean.MlssBean.CommodityListBeanXX> datal = new ArrayList<JsonBeanl.ResultBean.MlssBean.CommodityListBeanXX>();
    private String listUrl = "http://172.17.8.100/small/commodity/v1/commodityList";
    private ListView list;
    private ListAdter listAdter;


    @Override
    protected int initLayout() {
        return R.layout.tabfrag2;
    }

    @Override
    protected void ininView() {
        list = fvd(R.id.list);
    }

    @Override
    protected void initData() {

        //适配器
        listAdter = new ListAdter(datal, getActivity());
        list.setAdapter(listAdter);
        //判断网络
        if(Http.isABoolean(getActivity())){
            getmyData();
        }else{
            Toast.makeText(getActivity(), "请检查网络", Toast.LENGTH_SHORT).show();
        }
    }

    private void getmyData() {
        Http.MyAsTack(listUrl, new Http.CallBack() {
            @Override
            public void getData(String ss) {
                jiexi(ss);
            }
        });
    }


    private void jiexi(String ss) {
        Gson gson = new Gson();
        JsonBeanl jsonBeanl = gson.fromJson(ss, JsonBeanl.class);
        JsonBeanl.ResultBean result = jsonBeanl.getResult();
        JsonBeanl.ResultBean.MlssBean mlss = result.getMlss();
        List<JsonBeanl.ResultBean.MlssBean.CommodityListBeanXX> commodityList = mlss.getCommodityList();
        datal.addAll(commodityList);
        listAdter.notifyDataSetChanged();
    }
}

14.多条目

public class XListAdter extends BaseAdapter {

    private List<JsonBean.DataBean> data;
    private Context context;

    public XListAdter(List<JsonBean.DataBean> data, Context context) {
        this.data = data;
        this.context = context;
    }

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

    @Override
    public Object getItem(int position) {
        return null;
    }

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

    @Override
    public int getViewTypeCount() {
        return 2;
    }

    @Override
    public int getItemViewType(int position) {
        return position%2;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        switch (getItemViewType(position)){
            case 0:
                Holder holder;
                if (convertView==null){
                    convertView = View.inflate(context,R.layout.item,null );
                    holder = new Holder();
                    holder.name=convertView.findViewById(R.id.name);
                    holder.imag = convertView.findViewById(R.id.imag);
                    convertView.setTag(holder);
                }
                else{
                    holder = (Holder) convertView.getTag();
                }

                JsonBean.DataBean dataBean = data.get(position);

                holder.name.setText(dataBean.getTitle());
                ImageLoader.getInstance().displayImage(dataBean.getThumbnail_pic_s03(),holder.imag);
                break;

            case 1:
                Holder2 holder2;
                if (convertView==null){
                    convertView = View.inflate(context,R.layout.item2,null );
                    holder2 = new Holder2();
                    holder2.name2=convertView.findViewById(R.id.name2);
                    holder2.imag2 = convertView.findViewById(R.id.imag2);
                    convertView.setTag(holder2);
                }
                else{
                    holder2 = (Holder2) convertView.getTag();
                }

                JsonBean.DataBean dataBean2 = data.get(position);

                holder2.name2.setText(dataBean2.getTitle());
                ImageLoader.getInstance().displayImage(dataBean2.getThumbnail_pic_s03(),holder2.imag2);
                break;
        }
        return convertView;
      }
    class Holder{
        ImageView imag;
        TextView name;
      }

    class Holder2{
        ImageView imag2;
        TextView name2;
    }
}

15.http

public class Http {

    //网络判断
    public static boolean isABoolean(Context context){

        if(context!=null){
            ConnectivityManager  systemService = (ConnectivityManager)
                    context.getSystemService(Context.CONNECTIVITY_SERVICE);

            NetworkInfo info = systemService.getActiveNetworkInfo();
            if (info!=null){
                return info.isAvailable();
            }
        }
        return false;
    }

    //网络请求
    public static String requrtHttpGet(String s){

        try {
            URL url = new URL(s);
            HttpURLConnection  connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            int code = connection.getResponseCode();
            if (code==HttpURLConnection.HTTP_OK){
                InputStream stream = connection.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(stream,"utf-8"));

                StringBuilder builder = new StringBuilder();
                String str = "";
                while ((str = reader.readLine())!=null){
                     builder.append(str);
                }
                return builder.toString();
            }
            connection.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    //接口回调
    public interface CallBack{
        void getData(String ss);
    }
    //异步
    public static void MyAsTack(String url, final CallBack callBack){
        new AsyncTask<String,Void,String>(){

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

            @Override
            protected String doInBackground(String... strings) {
                return Http.requrtHttpGet(strings[0]);
            }
        }.execute(url);
    }
}

16.MySql

public class MySql extends SQLiteOpenHelper {
    public MySql(Context context) {
        super(context, "bawei.db", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table pers(id integer primary key," +
                "url text," +
                "json text)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}

17.Dao

public class Dao {

    private final MySql mySql;
    private String table="pers";

    public Dao(Context context){
        mySql = new MySql(context);
    }

    //添加数据库
    public void insertData(String url,String json){
        SQLiteDatabase sqLiteDatabase = mySql.getWritableDatabase();
        //添加
        ContentValues values = new ContentValues();
        values.put("url",url);
        values.put("json",json);
        sqLiteDatabase.insert(table,null,values);
    }

    //添加数据库
    public String quertData(String url){
        String json = "";
        SQLiteDatabase sqLiteDatabase = mySql.getWritableDatabase();
        Cursor query = sqLiteDatabase.query(table, null, "url=?", new String[]{url}, null, null, null);
        while (query.moveToNext()){
            json = query.getString(query.getColumnIndex("json"));
        }
        return json;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值