android listview标题置顶,Android仿QQ左滑删除置顶ListView操作
最近闲来无事,于是研究了一下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操作相关推荐
- Android开发学习之路-PopupWindow和仿QQ左滑删除
这周作业,要做一个类似QQ的左滑删除效果的ListView,因为不想给每个item都放一个按钮,所以决定用PopupWindow,这里记录一下 先放一下效果图: 先说明一下这里面的问题: ①没有做到像 ...
- 仿qq左滑删除listview_Java基于Swing和Netty仿QQ界面聊天小项目
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 来源:b ...
- 模仿QQ左滑删除当前会话列表
最近无聊,看了很多关于QQ列表侧滑删除的文章和技术文档,结合许多整理一下内容. 侧滑结构如图: 所需填充的数据由"文本"和"删除"2部分组成.代码如下 cont ...
- Android自定义组合控件---教你如何自定义下拉刷新和左滑删除
绪论 最近项目里面用到了下拉刷新和左滑删除,网上找了找并没有可以用的,有比较好的左滑删除,但是并没有和下拉刷新上拉加载结合到一起,要不就是一些比较水的结合,并不能在项目里面使用,小编一着急自己组合了一 ...
- Android开发之高仿QQ消息侧拉删除
Android开发之高仿QQ消息侧拉删除 QQ消息的侧滑删除效果之炫酷,想必大家都见过吧,本人作为一名安卓开发人员,遇到如此炫酷的效果,怎能不研究一番呢,现本人已实现其基本功能,现将代码贴出,望各位大 ...
- android 自定义 滑动删除,Android_Android ListView实现仿iPhone实现左滑删除按钮的简单实例,需要自定义ListView。这里就交Fl - phpStudy...
Android ListView实现仿iPhone实现左滑删除按钮的简单实例 需要自定义ListView.这里就交FloatDelListView吧. 复写onTouchEvent方法.如下: @Ov ...
- Android特效专辑(六)——仿QQ聊天撒花特效,无形装逼,最为致命
Android特效专辑(六)--仿QQ聊天撒花特效,无形装逼,最为致命 我的关于特效的专辑已经在CSDN上申请了一个专栏--http://blog.csdn.net/column/details/li ...
- Android UI视图效果篇之仿QQ好友列表分组悬浮PinnedHeaderExpandableListView
楼主是在平板上测试的,图片稍微有点大,大家看看效果就好 接下来贴源码: PinnedHeaderExpandableListView.java 要注意的是 在 onGroupClick方法中paren ...
- android弹窗使用总结,高仿QQ空间操作弹窗
android弹窗一共有两种方式,一种是dialog及其子类,另一种是popupwindow:Dialog及其子类尤其AlertDialog是最常用的,也是最自由的一种. **Popupwindow与 ...
最新文章
- ruby 新建对象_Ruby面向对象编程的简介
- javascript简单的四则运算
- golang beego 文件上传
- [VS2010]在C#工程中设置Reference的相对路径
- phonegap在android中如何退出程序
- C语言在STM32中的内存分配
- android操作XML的几种方式(转)
- scp 跨机远程拷贝
- 关于find指令的一点使用小心得 II
- Atitit 登录账号管理法passport 目录 1. 总则	1 1.1. 身份分类登录账号 管理员 操作人员 普通用户	1 1.2. 安全考虑,必须单独分开的账号储存表,使用不同等加密技术与秘
- html背景怎么变成透明的,怎样把图片背景变成透明
- Excel中阳历转阴历
- Python编写随机一百个人的姓名,加面试考核得分
- Win8.1安装与初次体验(图赏)
- xargs 重定向输出 示列分析
- TIA WinCC Professional入门经典(2) 创建画面与联合仿真
- 计算机1101与0100逻辑加,算术加和逻辑加分别什么意思
- PID算法控制的PWM调速
- 古代的银子和现在的人民币换算关系..
- React Hooks,拥有字节工牌的利器