ListView滑动删除
来源:互联网 发布:乐乎公寓官网电话 编辑:程序博客网 时间:2024/06/05 02:21
ListView滑动删除肯定大家都见过,比如QQ对话列表中就可以!
那么这个功能具体是怎么实现的呢,ListView展示数据和列表点击都很容易实现,但是如果是触摸,就没法了,
必须通过我们自己的努力来改写它来实现!先上效果图:
不知道是不是大家想要的效果,主页代码很简单:(MainActivity.java)
package cq.cake.dellistview;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity { private DelListView listView; private List<String> mDatas; private DelListViewAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initData(); initEvent(); } private void initView() { listView = (DelListView) findViewById(R.id.del_listview); } private void initData() { mDatas = new ArrayList<String>(); for (int i = 'A'; i <= 'Z'; i++) { mDatas.add("" + (char) i); } adapter = new DelListViewAdapter(this, mDatas); listView.setAdapter(adapter); } private void initEvent() { // 添加自定义listview的按钮单击事件,处理删除结果,和普通listview使用的唯一不同之处, listView.setOnItemDeleteListener(new DelListView.OnItemDeleteListener() { @Override public void onItemDelete(int index) { //删除当前数据集中对应数据,并刷新 mDatas.remove(index); adapter.notifyDataSetChanged(); } }); }}
package cq.cake.dellistview;import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.view.GestureDetector;import android.view.LayoutInflater;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.view.animation.AnimationUtils;import android.widget.ListView;/** * My Application -- cq.cake.dellistview * Created by Small Cake on 2016/1/29 10:36. */public class DelListView extends ListView implements GestureDetector.OnGestureListener, android.view.View.OnTouchListener { public DelListView(Context context, AttributeSet attrs) { super(context, attrs); gestureDetector = new GestureDetector(getContext(), this); setOnTouchListener(this); } /** * 手势识别类 */ private GestureDetector gestureDetector; /** * 滑动时出现的按钮 */ private View btnDelete; /** * listview的每一个item的布局 */ private ViewGroup viewGroup; /** * 选中的项 */ private int selectedItem; /** * 是否已经显示删除按钮 */ private boolean isDeleteShow; /** * 点击删除按钮时删除每一行的事件监听器 */ private OnItemDeleteListener onItemDeleteListener; public void setOnItemDeleteListener( OnItemDeleteListener onItemDeleteListener) { this.onItemDeleteListener = onItemDeleteListener; } /** * @类名称: OnItemDeleteListener * @描述: 删除按钮监听器 */ public interface OnItemDeleteListener { void onItemDelete(int selectedItem); } @Override public boolean onTouch(View v, MotionEvent event) { // 得到当前触摸的条目 selectedItem = pointToPosition((int) event.getX(), (int) event.getY()); // 如果删除按钮已经显示,那么隐藏按钮,异常按钮在当前位置的绘制 if (isDeleteShow) { btnHide(btnDelete); viewGroup.removeView(btnDelete); btnDelete = null; isDeleteShow = false; return false; } else { // 如果按钮没显示,则触发手势事件 // 由此去触发GestureDetector的事件,可以查看其源码得知,onTouchEvent中进行了手势判断,调用onFling return gestureDetector.onTouchEvent(event); } } @Override public boolean onDown(MotionEvent e) { // 得到当前触摸的条目 if (!isDeleteShow) { selectedItem = pointToPosition((int) e.getX(), (int) e.getY()); } return true; } @Override public void onShowPress(MotionEvent e) { } @Override public boolean onSingleTapUp(MotionEvent e) { return false; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { return false; } @Override public void onLongPress(MotionEvent e) { } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { // 如果删除按钮没有显示,并且手势滑动符合我们的条件 // 此处可以根据需要进行手势滑动的判断,如限制左滑还是右滑,我这里是左滑右滑都可以 Log.e("velocityX>>>"," "+Math.abs(velocityX)+" "); Log.e("velocityY>>>"," "+Math.abs(velocityY)+" "); if (!isDeleteShow && Math.abs(velocityX) > Math.abs(velocityY)) { // 在当前布局上,动态添加我们的删除按钮,设置按钮的各种参数、事件,按钮的点击事件响应我们的删除项监听器 btnDelete = LayoutInflater.from(getContext()).inflate(R.layout.layout_button, null); /** * 删除按钮的点击事件 */ btnDelete.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // btnHide(btnDelete); viewGroup.removeView(btnDelete); btnDelete = null; isDeleteShow = false; /** * 把参数传入接口,进行回调 */ onItemDeleteListener.onItemDelete(selectedItem); } }); viewGroup = (ViewGroup) getChildAt(selectedItem - getFirstVisiblePosition()); viewGroup.addView(btnDelete); btnShow(btnDelete); isDeleteShow = true; } else { setOnTouchListener(this); } return false; } /** * @方法名称: btnShow * @描述: 按钮显示时的动画 */ private void btnShow(View v) { v.startAnimation(AnimationUtils.loadAnimation(getContext(), R.anim.btn_show)); } /** * @方法名称: btnHide * @描述: 按钮隐藏时的动画 */ private void btnHide(View v) { v.startAnimation(AnimationUtils.loadAnimation(getContext(), R.anim.btn_hide)); }}
有了这两个主要文件,相信大家看看就能做出来同样的效果了,简单的布局和动画就不贴了,大家可以自己改造!
同时源码奉上,希望对需要的同学有所帮助:ListView滑动删除
1 0
- 实现listView滑动删除
- ListView 滑动删除效果
- listview滑动删除
- listView滑动删除
- ListView的滑动删除
- Android ListView滑动删除
- android,listView, 滑动删除
- listview滑动删除
- listview滑动删除
- android listview滑动删除
- 手势滑动删除ListView
- listview的滑动删除
- Android ListView 滑动删除
- ListView仿微信滑动删除
- listview的滑动删除
- Android滑动删除ListView
- 滑动删除--自定义ListView
- 滑动删除ListView
- Android Studio: Plugin with id 'android-library' not found 解决方法
- Oracle Instant Client 安装与配置
- baidu touch.js在某些机子(Motorola XT531)上旋转不动
- Redis 一致性hash
- Shiro使用和源码分析---6
- ListView滑动删除
- uva10970
- 在js中对中文和特殊字符转码,js转码(转载)
- Shiro使用和源码分析---7
- Java并发的四种风味:Thread、Executor、ForkJoin和Actor
- Try Finally 疑惑
- 字符串
- timestamp转成date格式
- Linux基本命令