QQ5.0列表滑动删除的简单实现_vue qq消息数怎么删除-程序员宅基地

技术标签: 滑动删除小列子  5.0新特性  

自定义一个view 继承LinearLayout:

代码:

public class SwipeLayout extends LinearLayout {

    private ViewDragHelper viewDragHelper;
    private View contentView;
    private View actionView;
    private int dragDistance;
    private final double AUTO_OPEN_SPEED_LIMIT = 800.0;
    private int draggedX;

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

    public SwipeLayout(Context context, AttributeSet attrs) {
        this(context, attrs, -1);
    }

    public SwipeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        viewDragHelper = ViewDragHelper.create(this, new DragHelperCallback());
    }

    @Override
    protected void onFinishInflate() {
        contentView = getChildAt(0);
        actionView = getChildAt(1);
        actionView.setVisibility(GONE);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        dragDistance = actionView.getMeasuredWidth();
    }

    private class DragHelperCallback extends ViewDragHelper.Callback {

        @Override
        public boolean tryCaptureView(View view, int i) {
            return view == contentView || view == actionView;
        }

        @Override
        public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {
            draggedX = left;
            if (changedView == contentView) {
                actionView.offsetLeftAndRight(dx);
            } else {
                contentView.offsetLeftAndRight(dx);
            }
            if (actionView.getVisibility() == View.GONE) {
                actionView.setVisibility(View.VISIBLE);
            }
            invalidate();
        }

        @Override
        public int clampViewPositionHorizontal(View child, int left, int dx) {
            if (child == contentView) {
                final int leftBound = getPaddingLeft();
                final int minLeftBound = -leftBound - dragDistance;
                final int newLeft = Math.min(Math.max(minLeftBound, left), 0);
                return newLeft;
            } else {
                final int minLeftBound = getPaddingLeft() + contentView.getMeasuredWidth() - dragDistance;
                final int maxLeftBound = getPaddingLeft() + contentView.getMeasuredWidth() + getPaddingRight();
                final int newLeft = Math.min(Math.max(left, minLeftBound), maxLeftBound);
                return newLeft;
            }
        }

        @Override
        public int getViewHorizontalDragRange(View child) {
            return dragDistance;
        }

        @Override
        public void onViewReleased(View releasedChild, float xvel, float yvel) {
            super.onViewReleased(releasedChild, xvel, yvel);
            boolean settleToOpen = false;
            if (xvel > AUTO_OPEN_SPEED_LIMIT) {
                settleToOpen = false;
            } else if (xvel < -AUTO_OPEN_SPEED_LIMIT) {
                settleToOpen = true;
            } else if (draggedX <= -dragDistance / 2) {
                settleToOpen = true;
            } else if (draggedX > -dragDistance / 2) {
                settleToOpen = false;
            }

            final int settleDestX = settleToOpen ? -dragDistance : 0;
            viewDragHelper.smoothSlideViewTo(contentView, settleDestX, 0);
            ViewCompat.postInvalidateOnAnimation(SwipeLayout.this);
        }
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        if(viewDragHelper.shouldInterceptTouchEvent(ev)) {
            return true;
        }
        return super.onInterceptTouchEvent(ev);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        viewDragHelper.processTouchEvent(event);
        return true;
    }

    @Override
    public void computeScroll() {
        super.computeScroll();
        if(viewDragHelper.continueSettling(true)) {
            ViewCompat.postInvalidateOnAnimation(this);
        }
    }
}
2:Mainactivity代码:

public class MainActivity extends AppCompatActivity {

    private RecyclerView rlv;
    private ArrayList<String> list;
    private RecyclerView.LayoutManager LayoutManager;

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


    }


    /**
     * 控件
     */
    private void initView() {
        rlv = (RecyclerView) findViewById(R.id.rlv);
    }

    /**
     * 数据
     */
    private void initData() {
        list = new ArrayList<>();
        for (int i = 0; i < 50; i++) {
            list.add("5.0新特性测试" + i);
        }
    }

    /**
     * 适配器
     */
    private void initAdapter() {
        ItemAdapter ItemAdapter = new ItemAdapter(this, list);
        LayoutManager = new GridLayoutManager(this, 1);
        rlv.setLayoutManager(LayoutManager);
        rlv.setAdapter(ItemAdapter);
    }

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

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rlv"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>
4:Item布局:
<com.lhz.swipelayoutexample.SwipeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="200dp" android:layout_width="match_parent" > <LinearLayout android:background="#ffffff" android:layout_height="50dp" android:layout_width="match_parent"> <TextView android:id="@+id/item_tv" android:layout_gravity="center_vertical" android:layout_height="wrap_content" android:layout_width="wrap_content" android:paddingLeft="20dp" android:text="@string/hello_world" android:textSize="20sp" /> </LinearLayout> <LinearLayout android:layout_height="50dp" android:layout_width="150dp"> <RelativeLayout android:background="#ff0000" android:clickable="true" android:id="@+id/delete_button" android:layout_height="50dp" android:layout_width="50dp"> <View android:background="@drawable/trash" android:layout_centerInParent="true" android:layout_height="28dp" android:layout_width="28dp" /> </RelativeLayout> <RelativeLayout android:background="#c2c2c2" android:clickable="true" android:id="@+id/view_button" android:layout_height="50dp" android:layout_width="50dp"> <View android:background="@drawable/magnifier" android:layout_centerInParent="true" android:layout_height="28dp" android:layout_width="28dp" /> </RelativeLayout> <RelativeLayout android:background="#aaffff" android:clickable="true" android:id="@+id/star_button" android:layout_height="50dp" android:layout_width="50dp"> <View android:background="@drawable/star" android:layout_centerInParent="true" android:layout_height="28dp" android:layout_width="28dp" /> </RelativeLayout> </LinearLayout></com.lhz.swipelayoutexample.SwipeLayout>
5:适配器:
package com.github.lzyzsd.swipelayoutexample;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.github.lzyzsd.viewdraghelperdemo.R;

import java.util.ArrayList;

/**
 *lhz
 * 2016.4.21
 */
public class ItemAdapter extends RecyclerView.Adapter implements View.OnClickListener {
    private ArrayList<String> list;
    private Context Context;

    public ItemAdapter(Context Context, ArrayList<String> list) {
        this.Context = Context;
        this.list = list;

    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View inflate = View.inflate(Context, R.layout.item_list, null);
        Demo Demo = new Demo(inflate);
        return Demo;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        Demo Demo = (ItemAdapter.Demo) holder;
        Demo.item_tv.setText(list.get(position));
        Demo.delete_button.setOnClickListener(this);
        Demo.view_button.setOnClickListener(this);
        Demo.star_button.setOnClickListener(this);
    }

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

    /**
     * 后面逻辑自己处理
     * @param v
     */
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.delete_button:
                Toast.makeText(Context, "delete_button", Toast.LENGTH_SHORT).show();

                break;
            case R.id.view_button:
                Toast.makeText(Context, "view_button", Toast.LENGTH_SHORT).show();

                break;
            case R.id.star_button:
                Toast.makeText(Context, "star_button", Toast.LENGTH_SHORT).show();

                break;
        }
    }

    private class Demo extends RecyclerView.ViewHolder {

        private final RelativeLayout star_button;
        private final RelativeLayout view_button;
        private final RelativeLayout delete_button;
        private final TextView item_tv;

        public Demo(View itemView) {
            super(itemView);
            delete_button = (RelativeLayout) itemView.findViewById(R.id.delete_button);
            view_button = (RelativeLayout) itemView.findViewById(R.id.view_button);
            star_button = (RelativeLayout) itemView.findViewById(R.id.star_button);
            item_tv = (TextView) itemView.findViewById(R.id.item_tv);
        }
    }
}

有问题可以发我邮箱[email protected]

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_33700351/article/details/51207986

智能推荐

ios信号从4g变成无服务器,iOS12.1.2信号差无法上网怎么办?4G断流解决方法-程序员宅基地

文章浏览阅读447次。原标题:iOS12.1.2信号差无法上网怎么办?4G断流解决方法今年的新iPhone从发售到现在都深陷信号门的舆论,此前有人将锅甩给英特尔的基带,但是外媒曾经对这款基带做过严谨的测试,发现基带性能是正常的。这也就意味着,新iPhone信号差是苹果优化不到位造成的。果不其然,在新机发售一段时间之后,苹果便推送了几个新的系统固件,大大改善了信号问题。不过解决了问题的同时,新系统也带来了新的信号毛病。 ..._ios12.1.2无volte选项

CORS带来的隐患_cors漏洞危害-程序员宅基地

文章浏览阅读3.6k次。跨域资源共享(CORS)跨域资源共享(cors)可以放宽浏览器的同源策略,可以通过浏览器让不同的网站和不同的服务器之间通信。1.同源策略同源策略在浏览器安全中是一种非常重要的概念,大量的客户端脚本支持同源策略,比如JavaScript。同源策略允许运行在页面的脚本可以无限制的访问同一个网站(同源)中其他脚本的任何方法和属性。当不同网站页面(非同源)的脚本试图去互相访问的时候,大多数的方法和..._cors漏洞危害

torch.cat()与torch.stack()——数组的拼接_先torch.cat再torch.stack-程序员宅基地

文章浏览阅读3.7k次,点赞11次,收藏8次。PyTorch学习笔记:torch.cat与torch.stack——张量的拼接torch.cat()torch.stack()cat与stack的区别torch.cat()torch.cat(tensors, dim=0, *, out=None) → Tensor官方解释:利用给定的维度连接给定的张量序列(cat代表concatenate),所有张量必须具有相同的形状(连接维度除外)或为空。相当于按指定维度将张量序列进行拼接参数解释:tensors:要连接的张量序列(元组tuple或者列_先torch.cat再torch.stack

如何选择汽车LiDAR的激光器和光电探测器_光电探测和激光探测的区别-程序员宅基地

文章浏览阅读1.8k次。from: http://www.eeworld.com.cn/qcdz/article_2017112520552.html据报道,激光雷达(LiDAR)与其它传感器技术(摄像头、雷达和超声波)的相互竞争增加了对传感器融合的需求,同时也要求对光电探测器、光源和MEMS微镜的仔细甄选。随着传感器技术、成像技术、雷达、LiDAR、电子设备和人工智能技术的进步,数十种先进驾驶辅助系_光电探测和激光探测的区别

python调用git在windows_python爬虫之git的使用(windows下pycharm使用)-程序员宅基地

文章浏览阅读207次。相信很多同学学会了git或者github以后都不知道怎么跟windows上的pycharm连在一起工作,那么下面我们开始介绍简单的安装和使用方法。一、安装1、首先你的有一个github的账户。注册什么的就不在这里说了,百度一大片。2、配置pycharm的github信息,一定要点击test测试。下载git的安装包,下载完成以后下一步下一步的安装完成即可。3、我使用的是默认路径安装,C:\Progr...

微型计算机中读写控制信号的作用是,微机原理与接口技术习题答案5章-程序员宅基地

文章浏览阅读550次。第5章总线及其形成1.微处理器的外部结构表现为数量有限的输入输出引脚,它们构成了微处理器级总线。2.微处理器级总线经过形成电路之后形成了系统级总线。3.简述总线的定义及在计算机系统中采用标准化总线的优点。答:总线是计算机系统中模块(或子系统)之间传输数据、地址和控制信号的公共通道,它是一组公用导线,是计算机系统的重要组成部分。采用标准化总线的优点是:1)简化软、硬件设计。2)简化系统结构。3)易于..._微机读写控制信号的作用是

随便推点

小程序路由传参的时候出现数据丢失-程序员宅基地

文章浏览阅读205次。在写把操作的答案通过路由传参的形式传到下一个页面的时候,在下一个页面获取的时候数据被截取了解决办法 使用encodeURIComponent 进行加密然后再另外一个页面获取的时候使用 decodeURIComponent 进行解码这样就解决了路由传参时数据丢失的情况了转载于:https://www.cnblogs.com/jeremy-o..._小程序推荐路由传参会丢失值吗

逻辑综合重点解析(Design Compiler篇)_rtl design → design compiler synthesis → gate-leve-程序员宅基地

文章浏览阅读2.5w次,点赞40次,收藏411次。逻辑综合重点解析(Design Compiler篇)前言 31、逻辑综合(Logic Synthesis)分为哪三个步骤? 42、当你拿到一个ddc格式的文件,你是否能够知道这是一个已经综合过的设计? 43、使用Design Compiler进行逻辑综合出现下述log,请问gtech.db和standard.sldb包含哪些信息? 44、Design Compiler综合过程中,targ..._rtl design → design compiler synthesis → gate-level design

vue-seamless-scroll使用中遇到关于click点击无效问题_vue-seamless-scroll实现点击效果不起作用-程序员宅基地

文章浏览阅读2.8k次,点赞4次,收藏10次。遇到的问题:当第一个ul中的数据滚动完时,第二个ul 部分的click事件不起作用,无法实现一些点击这行解决思路:利用js事件委托机制原来是在li里面绑定事件出现上述问题,后来给最外层的父级div加委托事件,让父级事件执行。通过e.target.dataset.code 获取所需值备注:vue中自定义属性格式为 data-xxx获取为:e.target.dataset.xxxid 和 name ......_vue-seamless-scroll实现点击效果不起作用

[javaweb]——spring框架之控制反转(IOC)与依赖注入(DI)_spring控制反转和依赖注入-程序员宅基地

文章浏览阅读2.1k次,点赞107次,收藏87次。spring框架的两大核心思想:控制反转,面向切面编程。控制反转:简称IOC,对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转依赖注入:简称DI,容器为程序提供运行时所依赖的资料,称为依赖注入。Bean对象:IOC容器中创建、管理的对象叫bean对象最后缕一缕:1.由于代码的高内聚(多功能混一块了),我们设计了出三层架构模式,Controller Service Dao,2.但是代码的耦合问题(一个模块对另一模块有依赖)没有解决,于是就有了控制反转与依赖注入,这两步合起来就是分层解耦。_spring控制反转和依赖注入

crontab: command not found解决方法-程序员宅基地

文章浏览阅读3.3k次。crontab命令是大多数系统都有的命令,有不排除由于有些系统被精简而没有的,这时对于CentOS系统,我们可以通过下面的命令来安装。yum -y install vixie-cron crontabsvixie-cron软件包是cron的主程序;crontabs软件包是用来安装、卸装、或列举用来驱动 cron 守护进程的表格的程序。_crontab: command not found

Julia: LaTeX 符号_latex xor-程序员宅基地

文章浏览阅读1.1k次,点赞3次,收藏8次。Julia是重度 LaTex符号的偏好的语言。所以,有必要收藏一下LaTex符号表。julia> for i ∈ 1:5 # /in if i ∉ 2:3 # /notin println(i) end end145julia> k = 4π # π : \pi12.566370614359172julia> num =rand()julia> if num ≤ 0.5 println(num) end # ≤ : \lequsin_latex xor