ListView实现不同的Item布局

点击免费下载源码
点击github下载
ListView是很多应用少不了的,有些应用的要求较为复杂,不是ListView嵌套GridView就是ListVIew嵌套ListVIew。更有甚者是两者都含有,而且还有其他不同形式的布局。
本人写了一个以前公司要求实现的布局如下图所示
这里写图片描述
左边其实是一个时间轴的效果,由于时间轴线的颜色太淡没有显示出来。为了实现这个功能当初是下了很多的功夫,也上网搜了一些demo但是都没有与此类似的,于是就自己实现。
想要实现这个布局其实并不是很难,只是当时一时不知道如何实现,走了不少弯路,浪费了不少时间。为了让更多的开发者少走弯路,本人就在此献丑了。这个布局真正的功能比这还要复杂一些,但是里面牵涉到公司的一些内容,就简化了一部分。
先说一下我的大致思路。
由于布局显示的item是不同的就要用到getItemViewType和getViewTypeCount()。继承BaseAdapter类,实现getItemViewType(int position)和getViewTypeCount() 方法,根据这两个方法,为item设置不同的标记,也就是不同的type,在getView方法中,利用getItemViewType(position)方法获取当前的type类型,然后根据不同的type类型,加载不同的item布局文件。

@Override
    public int getItemViewType(int position) {
        return mTypeList.get(position).type;
    }

    @Override
    public int getViewTypeCount() {
        return mTypeList.size();
    }

这个只是实现外面的一些布局。具体里面的就更简单了。里面就是一些布局的嵌套。用到了ListView嵌套GridView和ListView嵌套ListView。同时也解决了点击GridView更item的背景色。以及标记点击当前item的位置,下次进来仍要显示之前点击的item而不是默认的item,这个简单。

if (position == clickTemp) { // 执行判断
            // 设置背景
            holder.tv_appoint_doc_name
                    .setBackgroundResource(R.drawable.btn_gem_green);
            holder.tv_appoint_doc_name
                    .setTextColor(Color.parseColor("#ffffff"));
        } else {
            holder.tv_appoint_doc_name
                    .setBackgroundResource(R.drawable.btn_border_green);
            holder.tv_appoint_doc_name
                    .setTextColor(Color.parseColor("#000000"));
        }
        if (clickTemp == position) {
            holder.tv_appoint_doc_name
                    .setTextColor(Color.parseColor("#ffffff"));
        } else {
            holder.tv_appoint_doc_name
                    .setTextColor(Color.parseColor("#000000"));
        }

以上代码是如果没有item的点击事件是默认的为第一个按钮位选中状态,当有点击事件时就要改变选中按钮的状态。
由于时间有限,里面的很多代码不是很规范,如果您有时间的话还请您能够修改并更新到本人的github上面。先在此谢过了.

package com.liuyongxiang.listview.adapter;

import java.util.List;

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.Gallery;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.liuyongxiang.listview.R;
import com.liuyongxiang.listview.bean.TypeBean;
import com.liuyongxiang.listview.custom.CustomGridView;
import com.liuyongxiang.listview.custom.CustomListView;

public class ProcessListAdp extends BaseAdapter {
    private Context context;
    private List<TypeBean> mTypeList;
    private LayoutInflater inflater;
    List<String> leaderList;
    List<String> timeList;
    List<String> contentList;
    List<String> eastTimeList;
    List<String> eastContentList;
    List<String> bankList;
    List<String> docList;
    List<String> cashList;
    List<String> medicalList;
    List<String> flightList;
    List<String> taskList;
    public static final int APPOINT_DOC = 0;
    public static final int INFORM_CLIENT = 1;
    public static final int REQUEST_EXPERT = 2;
    public static final int INFORM_AVIATION = 3;
    public static final int APPLY_LEADER = 4;
    public static final int PREPARE_TAKE_OFF = 5;
    public static final int ORDER_FINISH = 6;
    boolean isPay;

    class ViewHolder1 {
        TextView tv_start_doc_time, tv_title;
        CustomGridView gv_start_doc_name;
        boolean flag_start_doc;
        boolean flag_start_time;
        boolean flag_start_doc_appoint;
        boolean flag_doc_isProcessed;
        boolean flag_doc_isFinished;
        boolean flag_doc_appoint;
        Button btn_start_sure;
        LinearLayout ll_start_appoint_doc, ll_start_appoint_content;

        ViewHolder1(View view) {
            tv_start_doc_time = (TextView) view
                    .findViewById(R.id.tv_start_doc_time);
            tv_title = (TextView) view.findViewById(R.id.tv_title);
            gv_start_doc_name = (CustomGridView) view
                    .findViewById(R.id.gv_start_doc_name);
            ll_start_appoint_doc = (LinearLayout) view
                    .findViewById(R.id.ll_start_appoint_doc);
            ll_start_appoint_content = (LinearLayout) view
                    .findViewById(R.id.ll_start_appoint_content);
            btn_start_sure = (Button) view.findViewById(R.id.btn_start_sure);
        }

    }

    class ViewHolder2 {
        TextView tv_bank_card_id, tv_bank, tv_first_aid, tv_title,
                tv_start_cash_time;
        LinearLayout ll_start_inform_client, ll_inform_client_pay;
        CustomGridView gv_cash_appoint;
        Button btn_cash_appoint, btn_client_upload;
        CustomListView lv_east;
        boolean flag_inform_client;
        boolean flag_inform_do_pro;
        boolean flag_inform_do_pro_appoint;
        boolean flag_cash_isProcessed;
        boolean flag_cash_isFinished;
        boolean flag_client_insure;
        boolean flag_affirm_gathering;
        boolean flag_cash_appoint;

        ViewHolder2(View view) {
            btn_cash_appoint = (Button) view
                    .findViewById(R.id.btn_cash_appoint);
            btn_client_upload = (Button) view
                    .findViewById(R.id.btn_client_upload);
            gv_cash_appoint = (CustomGridView) view
                    .findViewById(R.id.gv_cash_appoint);
            tv_bank_card_id = (TextView) view
                    .findViewById(R.id.tv_bank_card_id);
            tv_first_aid = (TextView) view.findViewById(R.id.tv_first_aid);
            tv_start_cash_time = (TextView) view
                    .findViewById(R.id.tv_start_cash_time);
            tv_bank = (TextView) view.findViewById(R.id.tv_bank);
            tv_title = (TextView) view.findViewById(R.id.tv_title);
            ll_start_inform_client = (LinearLayout) view
                    .findViewById(R.id.ll_start_inform_client);
            ll_inform_client_pay = (LinearLayout) view
                    .findViewById(R.id.ll_inform_client_pay);
            lv_east = (CustomListView) view.findViewById(R.id.lv_east);
        }

    }

    class ViewHolder3 {
        TextView tv_start_expert_time, tv_title;
        LinearLayout ll_start_request_expert, ll_start_request_expert_content;
        boolean flag_request_expert;
        boolean flag_request_expert_appoint;
        boolean flag_expert_isProcessed;
        boolean flag_expert_isFinished;
        Button btn_expert_appoint;
        CustomGridView gv_start_request_name;
        boolean flag_expert_appoint;

        ViewHolder3(View view) {
            ll_start_request_expert = (LinearLayout) view
                    .findViewById(R.id.ll_start_request_expert);
            btn_expert_appoint = (Button) view
                    .findViewById(R.id.btn_expert_appoint);
            tv_title = (TextView) view.findViewById(R.id.tv_title);
            tv_start_expert_time = (TextView) view
                    .findViewById(R.id.tv_start_expert_time);
            ll_start_request_expert_content = (LinearLayout) view
                    .findViewById(R.id.ll_start_request_expert_content);
            gv_start_request_name = (CustomGridView) view
                    .findViewById(R.id.gv_start_request_name);
        }

    }

    class ViewHolder4 {
        LinearLayout ll_start_inform_aviation,
                ll_start_inform_aviation_content;
        boolean flag_inform_aviation;
        boolean flag_inform_aviation_appoint;
        boolean flag_aviation_isProcessed;
        boolean flag_aviation_isFinished;
        Button btn_aviation_appoint;
        CustomListView lv_start_aoc;
        TextView tv_title, tv_start_aviation_time;
        boolean flag_aviation_appoint;

        ViewHolder4(View view) {
            ll_start_inform_aviation = (LinearLayout) view
                    .findViewById(R.id.ll_start_inform_aviation);
            btn_aviation_appoint = (Button) view
                    .findViewById(R.id.btn_aviation_appoint);
            ll_start_inform_aviation_content = (LinearLayout) view
                    .findViewById(R.id.ll_start_inform_aviation_content);
            lv_start_aoc = (CustomListView) view
                    .findViewById(R.id.lv_start_aoc);
            tv_title = (TextView) view.findViewById(R.id.tv_title);
            tv_start_aviation_time = (TextView) view
                    .findViewById(R.id.tv_start_aviation_time);
        }

    }

    class ViewHolder5 {
        TextView tv_apply_note, tv_apply_phone, tv_start_apply_leader_time;
        LinearLayout ll_start_apply_leader, ll_apply_leader_content;
        boolean flag_apply_leader;

        ViewHolder5(View view) {
            ll_start_apply_leader = (LinearLayout) view
                    .findViewById(R.id.ll_start_apply_leader);
            ll_apply_leader_content = (LinearLayout) view
                    .findViewById(R.id.ll_apply_leader_content);
            tv_apply_note = (TextView) view.findViewById(R.id.tv_apply_note);
            tv_apply_phone = (TextView) view.findViewById(R.id.tv_apply_phone);
            tv_start_apply_leader_time = (TextView) view
                    .findViewById(R.id.tv_start_apply_leader_time);
        }

    }

    class ViewHolder6 {
        TextView tv_start_doc_time, tv_sure_take_off, tv_sure_take_off_time;
        LinearLayout ll_sure_take_off;
        boolean flag_take_off;

        ViewHolder6(View view) {
            tv_sure_take_off_time = (TextView) view
                    .findViewById(R.id.tv_sure_take_off_time);
            tv_sure_take_off = (TextView) view
                    .findViewById(R.id.tv_sure_take_off);
            ll_sure_take_off = (LinearLayout) view
                    .findViewById(R.id.ll_sure_take_off);
        }

    }

    class ViewHolder7 {
        TextView tv_order_finish;

        ViewHolder7(View view) {
            tv_order_finish = (TextView) view
                    .findViewById(R.id.tv_order_finish);
        }

    }

    // 返回 代表某一个样式 的 数值
    public ProcessListAdp(Context context, List<TypeBean> mTypeList,
            List<String> leaderList, List<String> bankList,
            List<String> docList, List<String> cashList,
            List<String> medicalList, List<String> flightList,
            List<String> taskList, List<String> timeList,
            List<String> contentList, List<String> eastTimeList,
            List<String> eastContentList) {
        super();
        this.context = context;
        this.mTypeList = mTypeList;
        inflater = LayoutInflater.from(context);
        this.leaderList = leaderList;
        this.bankList = bankList;
        this.docList = docList;
        this.cashList = cashList;
        this.medicalList = medicalList;
        this.flightList = flightList;
        this.taskList = taskList;
        this.timeList = timeList;
        this.contentList = contentList;
        this.eastTimeList = eastTimeList;
        this.eastContentList = eastContentList;
    }

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

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

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

    @Override
    public int getItemViewType(int position) {
        return mTypeList.get(position).type;
    }

    @Override
    public int getViewTypeCount() {
        return mTypeList.size();
    }

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

        int type = getItemViewType(position);
        final ViewHolder1 holder1;
        final ViewHolder2 holder2;
        final ViewHolder3 holder3;
        final ViewHolder4 holder4;
        final ViewHolder5 holder5;
        final ViewHolder6 holder6;
        final ViewHolder7 holder7;
        if (convertView == null) {
            // 选择某一个样式。。
            switch (type) {
            case APPOINT_DOC:
                convertView = inflater.inflate(R.layout.item_start_appoint_doc,
                        null);
                holder1 = new ViewHolder1(convertView);
                holder1.flag_start_doc = true;
                holder1.flag_start_time = true;
                holder1.flag_start_doc_appoint = true;
                holder1.flag_doc_appoint = true;
                holder1.ll_start_appoint_doc
                        .setBackgroundResource(R.drawable.right_blue);
                holder1.ll_start_appoint_doc
                        .setOnClickListener(new OnClickListener() {

                            @Override
                            public void onClick(View view) {
                                if (holder1.flag_start_doc) {
                                    holder1.flag_start_doc = false;
                                    holder1.ll_start_appoint_content
                                            .setVisibility(View.VISIBLE);
                                    holder1.ll_start_appoint_doc
                                            .setBackgroundResource(R.drawable.down_blue);
                                } else {
                                    holder1.flag_start_doc = true;
                                    holder1.ll_start_appoint_content
                                            .setVisibility(View.GONE);
                                    holder1.ll_start_appoint_doc
                                            .setBackgroundResource(R.drawable.right_blue);
                                }
                            }
                        });
                final TestAdp testAdp = new TestAdp(
                        context, docList);
                holder1.gv_start_doc_name.setAdapter(testAdp);
                holder1.gv_start_doc_name
                        .setOnItemClickListener(new Gallery.OnItemClickListener() {
                            @SuppressLint("ResourceAsColor")
                            @Override
                            public void onItemClick(AdapterView<?> parent,
                                    View view, int position, long arg3) {
                                holder1.flag_doc_appoint = false;
                                for (int i = 0; i < parent.getCount(); i++) {
                                    View v = parent.getChildAt(i);
                                    if (position == i) {// 当前选中的Item改变背景颜色
                                        view.setBackgroundResource(R.drawable.btn_gem_green);
                                        testAdp
                                                .setSeclection(position);
                                        testAdp.notifyDataSetChanged();
                                    } else {
                                        v.setBackgroundResource(R.drawable.btn_border_green);
                                    }
                                }
                            }
                        });
                holder1.btn_start_sure
                        .setOnClickListener(new OnClickListener() {

                            @Override
                            public void onClick(View arg0) {
                            }
                        });
                convertView.setTag(holder1);
                break;
            case INFORM_CLIENT:
                convertView = inflater.inflate(
                        R.layout.item_start_inform_client, null);
                holder2 = new ViewHolder2(convertView);
                holder2.flag_inform_client = true;
                holder2.flag_inform_do_pro = true;
                holder2.flag_cash_appoint = true;
                holder2.flag_inform_do_pro_appoint = true;
                isPay = false;
                final ProcessAdp eastAdp = new ProcessAdp(context, eastTimeList,
                        eastContentList);
                holder2.lv_east.setAdapter(eastAdp);
                eastAdp.notifyDataSetChanged();
                holder2.ll_start_inform_client
                        .setBackgroundResource(R.drawable.right_blue);
                holder2.ll_start_inform_client
                        .setOnClickListener(new OnClickListener() {

                            @Override
                            public void onClick(View arg0) {
                                if (holder2.flag_inform_client) {
                                    holder2.flag_inform_client = false;
                                    holder2.ll_inform_client_pay
                                            .setVisibility(View.VISIBLE);
                                    holder2.ll_start_inform_client
                                            .setBackgroundResource(R.drawable.down_blue);
                                } else {
                                    holder2.flag_inform_client = true;
                                    holder2.ll_inform_client_pay
                                            .setVisibility(View.GONE);
                                    holder2.ll_start_inform_client
                                            .setBackgroundResource(R.drawable.right_blue);
                                }
                            }
                        });
                final TestAdp cashAdp = new TestAdp(context,
                        cashList);
                holder2.gv_cash_appoint.setAdapter(cashAdp);
                holder2.btn_client_upload
                        .setOnClickListener(new OnClickListener() {

                            @Override
                            public void onClick(View arg0) {
                            }
                        });
                holder2.gv_cash_appoint
                        .setOnItemClickListener(new Gallery.OnItemClickListener() {
                            @SuppressLint("ResourceAsColor")
                            @Override
                            public void onItemClick(AdapterView<?> parent,
                                    View view, int position, long arg3) {
                                holder2.flag_cash_appoint = false;
                                for (int i = 0; i < parent.getCount(); i++) {
                                    View v = parent.getChildAt(i);
                                    if (position == i) {// 当前选中的Item改变背景颜色
                                        view.setBackgroundResource(R.drawable.btn_gem_green);
                                        cashAdp
                                                .setSeclection(position);
                                        cashAdp.notifyDataSetChanged();
                                    } else {
                                        v.setBackgroundResource(R.drawable.btn_border_green);
                                    }
                                }
                            }
                        });
                holder2.btn_cash_appoint
                        .setOnClickListener(new OnClickListener() {
                            @Override
                            public void onClick(View view) {
                            }
                        });
                holder2.flag_client_insure = true;
                holder2.flag_affirm_gathering = true;
                convertView.setTag(holder2);
                break;
            case REQUEST_EXPERT:
                convertView = inflater.inflate(
                        R.layout.item_start_request_expert, null);
                holder3 = new ViewHolder3(convertView);
                holder3.flag_request_expert = true;
                holder3.flag_request_expert_appoint = true;
                holder3.flag_expert_appoint = true;
                holder3.ll_start_request_expert
                        .setBackgroundResource(R.drawable.right_blue);
                holder3.ll_start_request_expert
                        .setOnClickListener(new OnClickListener() {

                            @Override
                            public void onClick(View arg0) {
                                if (holder3.flag_request_expert) {
                                    holder3.flag_request_expert = false;
                                    holder3.ll_start_request_expert_content
                                            .setVisibility(View.VISIBLE);
                                    holder3.ll_start_request_expert
                                            .setBackgroundResource(R.drawable.down_blue);
                                } else {
                                    holder3.flag_request_expert = true;
                                    holder3.ll_start_request_expert_content
                                            .setVisibility(View.GONE);
                                    holder3.ll_start_request_expert
                                            .setBackgroundResource(R.drawable.right_blue);
                                }

                            }
                        });

                final TestAdp expertAdp = new TestAdp(
                        context, medicalList);

                holder3.gv_start_request_name.setAdapter(expertAdp);
                holder3.gv_start_request_name
                        .setOnItemClickListener(new Gallery.OnItemClickListener() {
                            @SuppressLint("ResourceAsColor")
                            @Override
                            public void onItemClick(AdapterView<?> parent,
                                    View view, int position, long arg3) {
                                holder3.flag_expert_appoint = false;
                                for (int i = 0; i < parent.getCount(); i++) {
                                    View v = parent.getChildAt(i);
                                    if (position == i) {// 当前选中的Item改变背景颜色
                                        view.setBackgroundResource(R.drawable.btn_gem_green);
                                        expertAdp
                                                .setSeclection(position);
                                        expertAdp.notifyDataSetChanged();
                                    } else {
                                        v.setBackgroundResource(R.drawable.btn_border_green);
                                    }
                                }
                            }
                        });
                holder3.btn_expert_appoint
                        .setOnClickListener(new OnClickListener() {

                            @Override
                            public void onClick(View view) {
                                holder3.ll_start_request_expert
                                        .setBackgroundResource(R.drawable.btn_red);
                            }
                        });
                convertView.setTag(holder3);
                break;
            case INFORM_AVIATION:
                convertView = inflater.inflate(
                        R.layout.item_start_inform_aviation, null);
                holder4 = new ViewHolder4(convertView);
                holder4.flag_inform_aviation = true;
                holder4.flag_inform_aviation_appoint = true;
                holder4.flag_aviation_appoint = true;
                final ProcessAdp adp = new ProcessAdp(context, timeList,
                        contentList);
                holder4.lv_start_aoc.setAdapter(adp);
                adp.notifyDataSetChanged();
                holder4.ll_start_inform_aviation
                        .setBackgroundResource(R.drawable.right_blue);
                holder4.ll_start_inform_aviation
                        .setOnClickListener(new OnClickListener() {
                            @Override
                            public void onClick(View arg0) {

                                if (holder4.flag_inform_aviation) {
                                    holder4.flag_inform_aviation = false;
                                    holder4.ll_start_inform_aviation_content
                                            .setVisibility(View.VISIBLE);
                                    holder4.ll_start_inform_aviation
                                            .setBackgroundResource(R.drawable.down_blue);
                                } else {
                                    holder4.flag_inform_aviation = true;
                                    holder4.ll_start_inform_aviation_content
                                            .setVisibility(View.GONE);
                                    holder4.ll_start_inform_aviation
                                            .setBackgroundResource(R.drawable.right_blue);
                                }
                            }
                        });
                holder4.btn_aviation_appoint
                        .setOnClickListener(new OnClickListener() {

                            @Override
                            public void onClick(View view) {

                            }
                        });
                convertView.setTag(holder4);
                break;
            case APPLY_LEADER:
                convertView = inflater.inflate(
                        R.layout.item_start_apply_leader, null);
                holder5 = new ViewHolder5(convertView);
                holder5.flag_apply_leader = true;
                holder5.ll_start_apply_leader
                        .setBackgroundResource(R.drawable.right_purplre);
                final String leaderPhone = leaderList.get(0);
                holder5.ll_start_apply_leader
                        .setOnClickListener(new OnClickListener() {

                            @Override
                            public void onClick(View arg0) {
                                if (holder5.flag_apply_leader) {
                                    holder5.flag_apply_leader = false;
                                    holder5.ll_apply_leader_content
                                            .setVisibility(View.VISIBLE);
                                    holder5.ll_start_apply_leader
                                            .setBackgroundResource(R.drawable.down_purplre);
                                } else {
                                    holder5.flag_apply_leader = true;
                                    holder5.ll_apply_leader_content
                                            .setVisibility(View.GONE);
                                    holder5.ll_start_apply_leader
                                            .setBackgroundResource(R.drawable.right_purplre);
                                }
                            }
                        });
                holder5.tv_apply_note.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View arg0) {
                        Intent intent = new Intent();
                        // 系统默认的action,用来打开默认的短信界面
                        intent.setAction(Intent.ACTION_SENDTO);
                        // 需要发短息的号码
                        intent.setData(Uri.parse("smsto:" + leaderPhone));
                        context.startActivity(intent);

                    }
                });
                holder5.tv_apply_phone
                        .setOnClickListener(new OnClickListener() {
                            @Override
                            public void onClick(View arg0) {
                            }
                        });
                convertView.setTag(holder5);
                break;
            case PREPARE_TAKE_OFF:
                convertView = inflater.inflate(
                        R.layout.item_start_prepare_take_off, null);
                holder6 = new ViewHolder6(convertView);
                    holder6.tv_sure_take_off
                            .setBackgroundResource(R.color.bg_red);
                convertView.setTag(holder6);
                break;
            case ORDER_FINISH:
                convertView = inflater.inflate(
                        R.layout.item_start_order_finish, null);
                holder7 = new ViewHolder7(convertView);
                    holder7.tv_order_finish
                            .setBackgroundResource(R.color.bg_gem_green);
                convertView.setTag(holder7);
                break;
            }
        } else {
            switch (type) {
            case APPOINT_DOC:
                holder1 = (ViewHolder1) convertView.getTag();
                break;
            case INFORM_CLIENT:
                holder2 = (ViewHolder2) convertView.getTag();
                break;
            case REQUEST_EXPERT:
                holder3 = (ViewHolder3) convertView.getTag();
                break;
            case INFORM_AVIATION:
                holder4 = (ViewHolder4) convertView.getTag();
                break;
            case APPLY_LEADER:
                holder5 = (ViewHolder5) convertView.getTag();
                break;
            case PREPARE_TAKE_OFF:
                holder6 = (ViewHolder6) convertView.getTag();
                break;
            case ORDER_FINISH:
                holder7 = (ViewHolder7) convertView.getTag();
                break;
            }
        }
        return convertView;
    }
}

点击此处免费下载源码
点击github下载
如果您对本人的劳动成果感到认可还请给予好评,如有疑问请加Android交流群 470707794或留言,本人定当竭力为您提供帮助,如果您有好的建议或能修改更好还请您不吝赐教更新到github上面来帮助更多的人。

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值