Android自定义View—HorizontalSlideDeleteListView
2015-06-15 15:29
435 查看
Android中可以用Listview的方式动态添加一个列表,像QQ、微信的好友列表都是用Listview动态添加。在QQ里面,有一栏是聊天记录,里面保存着正在跟你聊天的好友或一些推送的消息,这里有一个功能,就是我们可以选择将这个列表项删除,向左滑动,即出现一个删除的按钮,点击删除即可删除列表项,这种就是用到了HorizontalSlideDeleteListView。
首先要重写一个Listview类,并在xml中的Listview引用重写的类:
在重写类之前,要先写一个Adapter。首先是获取屏幕宽度并初始化删除按钮事件与Item滑动事件:
然后需要写一个方法,是实现Listview的滑动功能,并且是左右滑动,
然后再写一个方法,让这些列表项可删除,
这样就写好了Adapter,然后就可以重写Listview方法了,重写的方法继承Listview,Adapter引用重写的Adapter,下面是重写的方法:
重写完Listview,现在xml中的Listview已经是具有删除功能的了,在主的activity中,创建一个列表即可,创建列表的方式跟普通的创建列表的方式一样,首先先创建一个ArrayList,将需要的内容放到ArrayList中,然后新建一个adapter,将arraylist中的内容放进adapter中,最后设置adapter即可,具体代码如下:
首先要重写一个Listview类,并在xml中的Listview引用重写的类:
<com.example.horizontalslidelistview.HorizontalSlideDeleteListView android:id="@+id/listview" android:layout_width="match_parent" android:layout_height="wrap_content" />
在重写类之前,要先写一个Adapter。首先是获取屏幕宽度并初始化删除按钮事件与Item滑动事件:
public HorizontalSlideAdapter(Context context, List<String> objects) { super(context, 0, objects); // 获取屏幕宽度 Display defaultDisplay = ((Activity) context).getWindowManager() .getDefaultDisplay(); DisplayMetrics metrics = new DisplayMetrics(); defaultDisplay.getMetrics(metrics); mScreenWidth = metrics.widthPixels; //屏幕宽度 mParams = new LinearLayout.LayoutParams(mScreenWidth, LinearLayout.LayoutParams.MATCH_PARENT); //布局参数,动态让HorizontalScrollView中的TextView宽度包裹父容器 // 初始化删除按钮事件与item滑动事件 mDelOnclickImpl = new DeleteButtonOnclickImpl(); mScrollImpl = new ScrollViewScrollImpl(); }
然后需要写一个方法,是实现Listview的滑动功能,并且是左右滑动,
/** HorizontalScrollView的滑动事件 */ private class ScrollViewScrollImpl implements OnTouchListener { /** 记录开始时的坐标 */ private float startX = 0; @SuppressLint("ClickableViewAccessibility") @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: // 如果有划出删除按钮的itemView,就让他滑回去并且锁定本次touch操作,解锁会在父组件的dispatchTouchEvent中进行 if (mScrollView != null) { scrollView(mScrollView, HorizontalScrollView.FOCUS_LEFT); mScrollView = null; mLockOnTouch = true; return true; } startX = event.getX(); break; case MotionEvent.ACTION_UP: HorizontalScrollView view = (HorizontalScrollView) v; // 如果滑动了>50个像素,就显示出删除按钮 if (startX > event.getX() + 50) { startX = 0;// 因为公用一个事件处理对象,防止错乱,还原startX值 scrollView(view, HorizontalScrollView.FOCUS_RIGHT); mScrollView = view; } else { scrollView(view, HorizontalScrollView.FOCUS_LEFT); } break; } return false; } } /** HorizontalScrollView左右滑动 */ public void scrollView(final HorizontalScrollView view, final int parameter) { view.post(new Runnable() { @Override public void run() { view.pageScroll(parameter); } }); }
然后再写一个方法,让这些列表项可删除,
/** 删除事件 */ private class DeleteButtonOnclickImpl implements OnClickListener { @Override public void onClick(View v) { final ViewHolder holder = (ViewHolder) v.getTag(); Toast.makeText(getContext(), "删除第" + holder.position + "项", Toast.LENGTH_SHORT).show(); Animation animation = AnimationUtils.loadAnimation(getContext(), R.anim.anim_item_delete); holder.scrollView.startAnimation(animation); animation.setAnimationListener(new AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationRepeat(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { remove(getItem(holder.position)); } }); } }
这样就写好了Adapter,然后就可以重写Listview方法了,重写的方法继承Listview,Adapter引用重写的Adapter,下面是重写的方法:
public boolean dispatchTouchEvent(MotionEvent ev) { if(mAdapter.mLockOnTouch){ if (ev.getAction() == MotionEvent.ACTION_DOWN || ev.getAction() == MotionEvent.ACTION_MOVE) { //让滑动出删除按钮的那个itemView退回去 if (mAdapter.mScrollView != null) { mAdapter.scrollView(mAdapter.mScrollView, HorizontalScrollView.FOCUS_LEFT); mAdapter.mScrollView = null; } return true; } if (ev.getAction() == MotionEvent.ACTION_UP) { mAdapter.mLockOnTouch = false; } } return super.dispatchTouchEvent(ev); } @Override /** 设置adapter */ public void setAdapter(ListAdapter adapter) { super.setAdapter(adapter); mAdapter = (HorizontalSlideAdapter) adapter; }
重写完Listview,现在xml中的Listview已经是具有删除功能的了,在主的activity中,创建一个列表即可,创建列表的方式跟普通的创建列表的方式一样,首先先创建一个ArrayList,将需要的内容放到ArrayList中,然后新建一个adapter,将arraylist中的内容放进adapter中,最后设置adapter即可,具体代码如下:
private ListView mListView; private List<String> mDataList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initData(); mListView = (ListView) findViewById(R.id.listview); HorizontalSlideAdapter adapter = new HorizontalSlideAdapter(this, mDataList); mListView.setAdapter(adapter); } private void initData() { mDataList = new ArrayList<String>(); mDataList.add("11"); mDataList.add("11"); mDataList.add("11"); mDataList.add("11"); mDataList.add("11"); mDataList.add("11"); mDataList.add("11"); mDataList.add("11"); mDataList.add("11"); mDataList.add("11"); mDataList.add("11"); mDataList.add("11"); mDataList.add("11"); mDataList.add("11"); }
相关文章推荐
- Android自定义View—SildeMenu
- android 开发环境的搭建
- Android整机源码如何轻松下载?清华大学Android源码镜像
- Android自定义View—侧边栏菜单
- Android自定义View—自定义的DatePicker
- androidの监听EditView中的文本TextWatcher
- Android ViewDragHelper 实现 QQ5.0 侧滑
- Openfire + Smack 4.1.1 搭建Android聊天平台
- Android实用方法—返回键的监听
- Android优化系列——性能优化(资源存储)
- Android自定义View的实现方法,带你一步步深入了解View(四)
- Android报错"case expressions must be constant expressions"
- Design Support Library —— TextInputLayout
- android之ScrollView里嵌套ListView(转)
- drawableLeft
- AndroidManifest笔记
- android 中layer-list的用法
- android 开发:shape和selector和layer-list的(详细说明)
- cannot resolve symbol r android studio
- Android搜索框/滚动视图/notification