最近闲来无事,于是研究了一下qq的左滑删除效果,尝试着实现了一下,先上效果图:

大致思路原理:

- 通过设置margin实现菜单的显示与隐藏

- 监听onTouchEvent,处理滑动事件

上代码

import android.content.Context;

import android.util.AttributeSet;

import android.util.DisplayMetrics;

import android.view.MotionEvent;

import android.view.ViewGroup;

import android.view.WindowManager;

import android.widget.LinearLayout;

import android.widget.ListView;

/**

* Created by MooreLi on 2016/8/8.

*/

public class SlideListView extends ListView {

private String TAG = getClass().getSimpleName();

private int mScreenWidth;

private int mDownX;

private int mDownY;

private int mMenuWidth;

private boolean isMenuShow;

private boolean isMoving;

private int mOperatePosition = -1;

private ViewGroup mPointChild;

private LinearLayout.LayoutParams mLayoutParams;

public SlideListView(Context context) {

super(context);

getScreenWidth(context);

}

public SlideListView(Context context, AttributeSet attrs) {

super(context, attrs);

getScreenWidth(context);

}

public SlideListView(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

getScreenWidth(context);

}

private void getScreenWidth(Context context) {

WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

DisplayMetrics dm = new DisplayMetrics();

manager.getDefaultDisplay().getMetrics(dm);

mScreenWidth = dm.widthPixels;

}

@Override

public boolean onTouchEvent(MotionEvent ev) {

switch (ev.getAction()) {

case MotionEvent.ACTION_DOWN:

performActionDown(ev);

break;

case MotionEvent.ACTION_MOVE:

performActionMove(ev);

break;

case MotionEvent.ACTION_UP:

performActionUp();

break;

}

return super.onTouchEvent(ev);

}

private void performActionDown(MotionEvent ev) {

mDownX = (int) ev.getX();

mDownY = (int) ev.getY();

//如果点击的不是同一个item,则关掉正在显示的菜单

int position = pointToPosition(mDownX, mDownY);

if (isMenuShow && position != mOperatePosition) {

turnToNormal();

}

mOperatePosition = position;

mPointChild = (ViewGroup) getChildAt(position - getFirstVisiblePosition());

if (mPointChild != null) {

mMenuWidth = mPointChild.getChildAt(1).getLayoutParams().width;

mLayoutParams = (LinearLayout.LayoutParams) mPointChild.getChildAt(0).getLayoutParams();

mLayoutParams.width = mScreenWidth;

setChildLayoutParams();

}

}

private boolean performActionMove(MotionEvent ev) {

int nowX = (int) ev.getX();

int nowY = (int) ev.getY();

// if (isMoving) {

// if (Math.abs(nowY - mDownY) > 0) {

// Log.e(TAG, "kkkkkkk");

// onInterceptTouchEvent(ev);

// }

// }

if (Math.abs(nowX - mDownX) > 0) {

//左滑 显示菜单

if (nowX < mDownX) {

if (isMenuShow) {

mLayoutParams.leftMargin = -mMenuWidth;

} else {

//计算显示的宽度

int scroll = (nowX - mDownX);

if (-scroll >= mMenuWidth) {

scroll = -mMenuWidth;

}

mLayoutParams.leftMargin = scroll;

}

}

//右滑 如果菜单显示状态,则关闭菜单

if (isMenuShow && nowX > mDownX) {

int scroll = nowX - mDownX;

if (scroll >= mMenuWidth) {

scroll = mMenuWidth;

}

mLayoutParams.leftMargin = scroll - mMenuWidth;

}

setChildLayoutParams();

isMoving = true;

return true;

}

return super.onTouchEvent(ev);

}

private void performActionUp() {

//超过一半时,显示菜单,否则隐藏

if (-mLayoutParams.leftMargin >= mMenuWidth / 2) {

mLayoutParams.leftMargin = -mMenuWidth;

setChildLayoutParams();

isMenuShow = true;

} else {

turnToNormal();

}

isMoving = false;

}

private void setChildLayoutParams(){

if(mPointChild != null){

mPointChild.getChildAt(0).setLayoutParams(mLayoutParams);

}

}

/**

* 正常显示

*/

public void turnToNormal() {

mLayoutParams.leftMargin = 0;

mOperatePosition = -1;

setChildLayoutParams();

isMenuShow = false;

}

}

item的布局要注意,因为在自定义view中写死的是获取第一个子布局为显示内容,所以需要将显示的样式写在一个容器中,将菜单写在另一个容器中,两个平行的关系。

xml文件定义如下:

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:background="#FFFFFF"

android:orientation="horizontal">

android:layout_width="match_parent"

android:layout_height="60dp"

android:orientation="horizontal">

android:id="@+id/main_tv_title"

android:layout_width="wrap_content"

android:layout_height="match_parent"

android:layout_marginLeft="10dp"

android:gravity="center_vertical"

android:textSize="18sp" />

android:layout_width="180dp"

android:layout_height="60dp"

android:orientation="horizontal">

android:id="@+id/main_tv_delete"

android:layout_width="0dp"

android:layout_height="match_parent"

android:layout_weight="1"

android:background="#FF0000"

android:gravity="center"

android:text="删除"

android:textColor="#FFFFFF" />

android:id="@+id/main_tv_top"

android:layout_width="0dp"

android:layout_height="match_parent"

android:layout_weight="1"

android:background="#DFCDBF"

android:gravity="center"

android:text="置顶"

android:textColor="#FFFFFF" />

最后就是删除操作与置顶操作,这个就比较简单,给按钮添加点击事件即可。我是在adapter中定义实现,记得操作后要将菜单关掉!

上部分代码:

holder.tvTitle.setText(mInfos.get(position));

holder.tvDelete.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

mInfos.remove(position);

notifyDataSetChanged();

mListView.turnToNormal();

}

});

holder.tvTop.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

String temp = mInfos.get(position);

mInfos.remove(position);

mInfos.add(0, temp);

notifyDataSetChanged();

mListView.turnToNormal();

}

});

最后还有一个遗留问题,ListView左右滑动的时候上下也会滑动,这个有待探索与改进,也希望大家提提意见,帮我改进!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

android listview标题置顶,Android仿QQ左滑删除置顶ListView操作相关推荐

  1. Android开发学习之路-PopupWindow和仿QQ左滑删除

    这周作业,要做一个类似QQ的左滑删除效果的ListView,因为不想给每个item都放一个按钮,所以决定用PopupWindow,这里记录一下 先放一下效果图: 先说明一下这里面的问题: ①没有做到像 ...

  2. 仿qq左滑删除listview_Java基于Swing和Netty仿QQ界面聊天小项目

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 来源:b ...

  3. 模仿QQ左滑删除当前会话列表

    最近无聊,看了很多关于QQ列表侧滑删除的文章和技术文档,结合许多整理一下内容. 侧滑结构如图: 所需填充的数据由"文本"和"删除"2部分组成.代码如下 cont ...

  4. Android自定义组合控件---教你如何自定义下拉刷新和左滑删除

    绪论 最近项目里面用到了下拉刷新和左滑删除,网上找了找并没有可以用的,有比较好的左滑删除,但是并没有和下拉刷新上拉加载结合到一起,要不就是一些比较水的结合,并不能在项目里面使用,小编一着急自己组合了一 ...

  5. Android开发之高仿QQ消息侧拉删除

    Android开发之高仿QQ消息侧拉删除 QQ消息的侧滑删除效果之炫酷,想必大家都见过吧,本人作为一名安卓开发人员,遇到如此炫酷的效果,怎能不研究一番呢,现本人已实现其基本功能,现将代码贴出,望各位大 ...

  6. android 自定义 滑动删除,Android_Android ListView实现仿iPhone实现左滑删除按钮的简单实例,需要自定义ListView。这里就交Fl - phpStudy...

    Android ListView实现仿iPhone实现左滑删除按钮的简单实例 需要自定义ListView.这里就交FloatDelListView吧. 复写onTouchEvent方法.如下: @Ov ...

  7. Android特效专辑(六)——仿QQ聊天撒花特效,无形装逼,最为致命

    Android特效专辑(六)--仿QQ聊天撒花特效,无形装逼,最为致命 我的关于特效的专辑已经在CSDN上申请了一个专栏--http://blog.csdn.net/column/details/li ...

  8. Android UI视图效果篇之仿QQ好友列表分组悬浮PinnedHeaderExpandableListView

    楼主是在平板上测试的,图片稍微有点大,大家看看效果就好 接下来贴源码: PinnedHeaderExpandableListView.java 要注意的是 在 onGroupClick方法中paren ...

  9. android弹窗使用总结,高仿QQ空间操作弹窗

    android弹窗一共有两种方式,一种是dialog及其子类,另一种是popupwindow:Dialog及其子类尤其AlertDialog是最常用的,也是最自由的一种. **Popupwindow与 ...

最新文章

  1. ruby 新建对象_Ruby面向对象编程的简介
  2. javascript简单的四则运算
  3. golang beego 文件上传
  4. [VS2010]在C#工程中设置Reference的相对路径
  5. phonegap在android中如何退出程序
  6. C语言在STM32中的内存分配
  7. android操作XML的几种方式(转)
  8. scp 跨机远程拷贝
  9. 关于find指令的一点使用小心得 II
  10. Atitit 登录账号管理法passport 目录 1. 总则 1 1.1. 身份分类登录账号 管理员 操作人员 普通用户 1 1.2. 安全考虑,必须单独分开的账号储存表,使用不同等加密技术与秘
  11. html背景怎么变成透明的,怎样把图片背景变成透明
  12. Excel中阳历转阴历
  13. Python编写随机一百个人的姓名,加面试考核得分
  14. Win8.1安装与初次体验(图赏)
  15. xargs 重定向输出 示列分析
  16. TIA WinCC Professional入门经典(2) 创建画面与联合仿真
  17. 计算机1101与0100逻辑加,算术加和逻辑加分别什么意思
  18. PID算法控制的PWM调速
  19. 古代的银子和现在的人民币换算关系..
  20. React Hooks,拥有字节工牌的利器

热门文章

  1. python定时器 是线程吗_定时器中断线程python
  2. hexo搭建个人博客_hexo 搭建个人博客
  3. leetcode 273场周赛 Problem-C
  4. 开方计算与浮点数的问题
  5. RecSys Challenge 历年推荐赛题汇总
  6. OpenCV——读取图片的数据类型必须是int8类型吗?
  7. Faster R-CNN——学习笔记~
  8. C++模版 (一) ----- 函数模版
  9. 2019年终总结-如果这是一场电影
  10. Numpy:ndim、shape、dtype、astype用法介绍