Android listview 右滑删除

Android 使用开源库加载网络图片 Android 使用开源库加载网络图片,使用开源库加载图片。单击listview弹出popupwindow弹出框详情查看: Android 单击listview弹出popupwindow弹出框 ,里面还附带listview右滑删除按钮详情查看:Android 使用NineOldAndroids实现仿微信listview左滑出现删除itembutton。项目就是这样慢慢变得复杂,是往里面逐渐 阅读详情
这次交大家使用listview的右滑删除,其实也非常简单, 

首先需要自定义listview,具体代码如下:

package com.example.myapp;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Scroller;


public class SlideListView extends ListView {

    private int slidePosition;

    private int downY;

    private int downX;

    private int screenWidth;

    private View itemView;

    private Scroller scroller;
    private static final int SNAP_VELOCITY = 600;

    private VelocityTracker velocityTracker;

    private boolean isSlide = false;

    private int mTouchSlop;

    private RemoveListener mRemoveListener;

    private boolean isRemove = false;

    private RemoveDirection removeDirection;


    public enum RemoveDirection {
        RIGHT, LEFT, NONE;
    }


    public SlideListView(Context context) {
        this(context, null);
    }

    public SlideListView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public SlideListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        screenWidth = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getWidth();
        scroller = new Scroller(context);
        mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
    }


    public void setRemoveListener(RemoveListener removeListener) {
        this.mRemoveListener = removeListener;
    }


    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN: {
            addVelocityTracker(event);


            if (!scroller.isFinished()) {
                return false;
            }
            downX = (int) event.getX();
            downY = (int) event.getY();

            slidePosition = pointToPosition(downX, downY);


            if (slidePosition == AdapterView.INVALID_POSITION) {
                return super.dispatchTouchEvent(event);
            }


            itemView = getChildAt(slidePosition - getFirstVisiblePosition());
            break;
        }
        case MotionEvent.ACTION_MOVE: {
            if (Math.abs(getScrollVelocity()) > SNAP_VELOCITY
                    || (Math.abs(event.getX() - downX) > mTouchSlop && Math
                            .abs(event.getY() - downY) < mTouchSlop)) {
                isSlide = true;

            }
            break;
        }
        case MotionEvent.ACTION_UP:
            recycleVelocityTracker();
            break;
        }

        return super.dispatchTouchEvent(event);
    }


    private void scrollRight() {
        removeDirection = RemoveDirection.RIGHT;
        final int delta = (screenWidth + itemView.getScrollX());
                scroller.startScroll(itemView.getScrollX(), 0, -delta, 0,
                Math.abs(delta));
        postInvalidate();
    }


    private void scrollLeft() {
        removeDirection = RemoveDirection.LEFT;
        final int delta = (screenWidth - itemView.getScrollX());

        scroller.startScroll(itemView.getScrollX(), 0, delta, 0,
                Math.abs(delta));
        postInvalidate();
    }


    private void scrollBack(){
        removeDirection = RemoveDirection.NONE;
        scroller.startScroll(itemView.getScrollX(), 0, -itemView.getScrollX(), 0,
                Math.abs(itemView.getScrollX()));
        postInvalidate();
    }


    private void scrollByDistanceX() {

        if (itemView.getScrollX() >= screenWidth / 2) {
            scrollLeft();
        } else if (itemView.getScrollX() <= -screenWidth / 2) {
            scrollRight();
        } else {

            scrollBack();
        }

    }


    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        if (isSlide && slidePosition != AdapterView.INVALID_POSITION) {
            requestDisallowInterceptTouchEvent(true);
            addVelocityTracker(ev);
            final int action = ev.getAction();
            int x = (int) ev.getX();
            switch (action) {
            case MotionEvent.ACTION_DOWN:
                System.out.println("touch-->" + "down");
                break;
            case MotionEvent.ACTION_MOVE:
                System.out.println("touch-->" + "move");
                MotionEvent cancelEvent = MotionEvent.obtain(ev);
                cancelEvent.setAction(MotionEvent.ACTION_CANCEL |
                           (ev.getActionIndex()<< MotionEvent.ACTION_POINTER_INDEX_SHIFT));
                onTouchEvent(cancelEvent);

                int deltaX = downX - x;


                itemView.scrollTo(deltaX, 0);

                itemView.setAlpha(1f - Math.abs((float)deltaX/screenWidth));

                return true;
            case MotionEvent.ACTION_UP:

                isSlide = false;
                int velocityX = getScrollVelocity();
                if (velocityX > SNAP_VELOCITY) {
                    scrollRight();
                } else if (velocityX < -SNAP_VELOCITY) {
                    scrollLeft();
                } else {
                    scrollByDistanceX();
                }

                recycleVelocityTracker();

                break;
            }
        }


        return super.onTouchEvent(ev);
    }

    @Override
    public void computeScroll() {

        if (scroller.computeScrollOffset()) {

            itemView.scrollTo(scroller.getCurrX(), scroller.getCurrY());

            itemView.setAlpha(1f - Math.abs((float)scroller.getCurrX()/screenWidth));

            postInvalidate();


            if (scroller.isFinished() && removeDirection != RemoveDirection.NONE) {
                if (mRemoveListener == null) {
                    throw new NullPointerException("RemoveListener is null, we should called setRemoveListener()");
                }
                itemView.scrollTo(0, 0);
                itemView.setAlpha(1f);
                mRemoveListener.removeItem(removeDirection, slidePosition);
            }
        }
    }


    private void addVelocityTracker(MotionEvent event) {
        if (velocityTracker == null) {
            velocityTracker = VelocityTracker.obtain();
        }

        velocityTracker.addMovement(event);
    }


    private void recycleVelocityTracker() {
        if (velocityTracker != null) {
            velocityTracker.recycle();
            velocityTracker = null;
        }
    }


    private int getScrollVelocity() {
        velocityTracker.computeCurrentVelocity(1000);
        int velocity = (int) velocityTracker.getXVelocity();
        return velocity;
    }


    public interface RemoveListener {
        public void removeItem(RemoveDirection direction, int position);
    }

}

然后使用SlideListView .setRemoveListener listview的这个方法就可以实现listview的右滑删除了。
实现Android ListView点击弹出带删除功能的PopupWindow 滑动冲突通常发生在两个滑动组件重叠使用时,其核心问题在于:当用户触摸屏幕进行滑动操作时,系统难以判断是应该触发哪一个组件的滑动事件。具体到ListView与PopupWindow的场景中,当PopupWindow附着在ListView的某个item上,用户可能既想滑动ListView的item列表,又可能想关闭PopupWindow,这就造成了滑动目标的混淆。在一些极端的交互设计中,用户可能会同时进行垂直和水平滑动,这种多维度的滑动操作使冲突更加复杂。 阅读详情

相关推荐

Android——实现RecyclerView左侧滑删除与右侧滑选择

RecyclerView的各种效果实现。 实现效果: 侧滑删除(带自动校位滑动效果); 右滑出现选择框; 一键全选。

Android RecyclerView的 拖拽 拖动位置以及右滑删除包含源码 私信

先使用RecyclerView写好一个基本列表。

jht2667796626的博客 876

详解Android中实现ListView左右滑动删除条目的方法

主要介绍了Android中实现ListView左右滑动删除条目的方法,文中分别展示了通过Scroller和NineOldAndroids来实现的例子,需要的朋友可以参考下

滑动删除以及左滑右滑

滑动删除iteam的滑动简易版都可以实现

qq_34178710的博客 739

Python与Wind量化接口实战:从配置到数据提取全流程解析

本文详细解析了Python与Wind量化接口的实战应用,从环境配置到数据提取全流程。通过Anaconda管理Python环境,安装WindPy接口,实现历史行情、截面数据和实时行情的查询与优化。文章还提供了高级功能如批量查询、数据缓存策略及实战案例,帮助开发者高效构建量化分析框架。

omega的博客 1327

Transformer凭什么取代RNN?深入拆解自注意力机制与梯度消失问题的终极对决

本文深入探讨了Transformer如何通过自注意力机制解决RNN的梯度消失问题,成为自然语言处理领域的新标准。通过对比RNN和Transformer的架构差异,揭示了自注意力机制在并行计算、长期依赖处理等方面的技术优势,并提供了实际任务中的性能对比数据。

f6g7h8i9j的博客 190

android右滑删除,android实现简单左滑删除控件

本文为大家分享了一个简单的android左滑删除控件,供大家参考,具体内容如下import android.animation.ValueAnimator;import android.content.Context;import android.graphics.PointF;import android.support.v4.view.ViewConfigurationCompat;impor...

weixin_30268555的博客 502

eVTOL热管理:从电动车到飞行器的技术跃迁与工程挑战

热管理系统是保障各类电动设备安全、高效运行的核心技术,其基本原理是通过冷却、加热和温度控制,确保电池、电机等关键部件在最佳工况下工作。在新能源汽车领域,热管理技术已相对成熟,但面对eVTOL(电动垂直起降飞行器)这一新兴领域,其设计逻辑需从二维地面转向三维空域,应对环境温度剧烈变化、重量约束极端严苛等全新挑战。eVTOL的热管理不仅是简单的技术移植,更涉及对电池瞬时高功率散热、乘员舱快速温控及多热源耦合等复杂工程问题的系统性解决,直接关系到飞行安全与商业航程。本文聚焦于**环境温度**和**有效载荷**等关

weixin_42521276的博客 612

andriod项目实战之二十二---列表右滑删除功能实现

andriod项目实战之二十二---列表右滑删除功能实现

sccd2009的专栏 663

玄机-Linux权限维持-后门

玄机-Linux权限维持-后门

m0_46439803的博客 763

YOLOv8工业缺陷检测实战:攻克光照不均难题,精度从70%到92%的全流程优化(附缺陷数据集)

YOLOv8在工业缺陷检测中突破光照不均难题,核心是“硬件控光+数据造景+模型聚焦+训练攻坚硬件控光:从源头减少光照变异,降低算法难度;数据造景:用CLAHE、合成样本让模型“见过足够多的光照情况”;模型聚焦:用ECA注意力和Focal-EIoU损失,让模型盯住缺陷而非光照;训练攻坚:分阶段+难例挖掘,强迫模型学习薄弱点。这套方案已在汽车轴承、手机外壳、PCB板3类产线落地,平均精度提升20%+,漏检率控制在0.08%以内,完全满足工业级要求。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1195

android listview 右滑删除(android 项目心得五)

这次交大家使用listview的右滑删除,其实也非常简单, 首先需要自定义listview,具体代码如下:package com.example.myapp;import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.Ve

qq_37999820的博客 746

Kafka 入门篇(一)

初识 Kafka 什么是 Kafka Kafka 的基本术语 Kafka 的特性(设计原则) Kafka 的使用场景 Kafka 的消息队列 点对点模式的消息队列 发布-订阅模式的消息队列 Kafka 系统架构 核心 API Kafka 为何如此之快 broker 端配置 broker.id port zookeeper.connect log.dirs num.recovery.threads.per.data.dir auto.create.topics.enable topic默认配置 num.par

1232

Android 项目需求:已经整好的列表ListView无侵入的加入右滑删除控件(自定义右滑控件操作)

已经整好了listView,后续需要加入右滑删除,在网上查了一堆资料,最终整理了一个无侵入性的,如果有引用到的,麻烦回复下,表示敬意谢意. 1.建立SwipeItemLayout (作为子项item的最外层布局) import android.content.Context; import android.support.v4.view.ViewCompat; import andr...

吴锡钒的博客 463

从零开始学习PX4源码9(部署px4源码到gitee)

由于PX4-Autopilot托管在github,在没有翻墙的情况下,下载固件无法下载。为了提高下载速度,这里将PX4在github上的仓库以及其子仓库(依赖仓库)都搬移到gitee上了。本教程讲解如何快速部署px4固件到gitee上,实现不需要翻墙快速本地就可以下载PX4固件。暂时没有找到如何批量直接通过修改.gitmodules后,使用什么命令可以直接把所有的一级二级子模块的指向直接正常映射。!!

陌城烟雨 810

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Android SwipeToDismiss:左滑/右滑删除ListView条目Item

 《Android SwipeToDismiss:左右滑动删除ListView条目Item》 Android的SwipeToDismiss是github上一个第三方开源框架(github上的项目链接地址:https://github.com/romannurik/Androi...

chuoshao2508的博客 175

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Android 第三方开源SwipeToDismiss:左滑/右滑删除ListView条目Item

package com.example.swipetodismiss; import java.util.ArrayList; import java.util.List; import com.example.android.swipedismiss.SwipeDismissListViewTouchListener; import com.example.android

Ke1vin的博客 1353

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

自定义ListView实现仿QQ消息列表滑动item出现删除按钮

最近项目组中要出线下版产品,其中一个界面需要实现一个右滑Listview中item,然后可以删除和重命名该item。正好我最近在看自定义控件,所以自荐做这个页面的交互设计,也算练手。刚开始我想的太简单了,我以为添加一个滑动的action,然后item去响应这个action就好了,至于滑动多少距离,或者说item滚动多少距离,不同的滚动会有怎样的效果,好多实际的问题没有考虑进去,当初自己写出来,也是

Fleur爱编程 2066

RecycleView实现左右滑动监听和上下拖拽调换顺序

之前想实现ListView右滑删除和上下拖拽交换位置的功能,但是找来找去,要么就实现上比较复杂,要么就是代码太老了。从github找了几个开源项目,但是总是有这样那样的bug。但是后来得知看到Google居然已经内置了这两个功能,只需要使用v7包里的RecycleView去实现就可以了。 代码如下 package justwen.demorecycleview; import and

Justwen26的博客 3007

TencentDB Agent Memory版本更新日志:每个版本带来的新功能与改进

TencentDB Agent Memory是一款团队级AI Agent记忆中枢,能够将对话、文档和代码转化为四种可重用的记忆资产(Chat Memory、Skill、LLM-Wiki、Code-Graph),实现跨Agent和框架的治理、共享与装备。以下是各版本的更新亮点,助您快速了解每个版本带来的核心改进与新功能。 ## 最新未发布版本(Unreleased) ### ✨ 核心功能升级

gitblog_00811的博客 797
上一篇: Android ViewPager不可滑动
下一篇: Android 自定义UI-单点触摸-多点触摸
南岸北栀
博客等级 码龄10年 32粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值