HorizontalScrollView嵌套在ListView,实现从右向左滑动单个删除,当滑动出来后,解决HorizontalScrollView被ListView回收+多个删除
2016-05-11 08:50
489 查看
本身是想写一个:HorizontalScrollView和ScrollView冲突的文章,后来写着写着就变成了HorizontalScrollView嵌套在ListView被回收问题了。
解决这个问题的思路:
生成一个装int类型的position数组,这个数组用来记录哪个item是被滑动了(也就是删除漏出来的),也就是说如果删除是漏出来的话,你就要把这个position装到数组中去,如果又划回去(删除又看不见了),则把position从数组移除。在getView的时候,去遍历这个数组,如果删除露出来就让item执行holder.mDelete_Item_root.scrollTo(pos.x, pos.y);,如果又划回去了(删除又看不见了)就让item执行holder.mDelete_Item_root.scrollTo(0,
0);
写一个接口
当你滑动从右到左(把删除漏出来),执行此接口
装载滑动从右到左(把删除漏出来)的position
这就是处理整个滑动的逻辑
效果很理想,记得运行demo时用720x1280的屏幕
下载地址:http://download.csdn.net/detail/u012123938/9516209
解决这个问题的思路:
生成一个装int类型的position数组,这个数组用来记录哪个item是被滑动了(也就是删除漏出来的),也就是说如果删除是漏出来的话,你就要把这个position装到数组中去,如果又划回去(删除又看不见了),则把position从数组移除。在getView的时候,去遍历这个数组,如果删除露出来就让item执行holder.mDelete_Item_root.scrollTo(pos.x, pos.y);,如果又划回去了(删除又看不见了)就让item执行holder.mDelete_Item_root.scrollTo(0,
0);
写一个接口
public interface ScrollListener { void scroll(int vis, int x, int y); }
当你滑动从右到左(把删除漏出来),执行此接口
if (event.getAction() == MotionEvent.ACTION_UP) { end = (int) event.getRawX(); if (start > end) { if (getScrollX() < width / 2 || velocityTracker.getXVelocity() > SWIPE_THRESHOLD_VELOCITY) { smoothScrollTo(0, 0); listener.scroll(1, 0, 0); } else { smoothScrollTo(width, 0); //当你滑动从右到左(把删除漏出来),执行此接口 listener.scroll(SCROLL_VISABLE, width, 0); } } if (start < end) { if (getScrollX() > width / 2 || velocityTracker.getXVelocity() > SWIPE_THRESHOLD_VELOCITY) { smoothScrollTo(width, 0); listener.scroll(3, width, 0); } else { smoothScrollTo(0, 0); listener.scroll(SCROLL_INVISABLE, 0, 0); } } velocityTracker.clear(); return true; }
装载滑动从右到左(把删除漏出来)的position
class PositionHolder { int position; int x; int y; public PositionHolder(int vis, int x, int y) { super(); this.position = vis; this.x = x; this.y = y; } }
这就是处理整个滑动的逻辑
holder.mDelete_Item_root.setListener(new ScrollListener() { @Override public void scroll(int vis, int x, int y) { //如果滑动从右到左(把删除漏出来),将此item的position添加到positions if (vis == DeleteView.SCROLL_VISABLE) { positions.add(new PositionHolder(position, x, y)); //如果滑动从左到右(把删除影藏),将positions中对应的position删除 } else if (vis == DeleteView.SCROLL_INVISABLE) { if (positions.size() > 0) { positions.remove(position); } } } }); //遍历整个position是否有被滑动出来的item for (int i = 0; i < positions.size(); i++) { PositionHolder pos = positions.get(i); if (pos.position == position) { holder.mDelete_Item_root.scrollTo(pos.x, pos.y); } else if (pos.position < position) { holder.mDelete_Item_root.scrollTo(0, 0); } } if (isAble) {//打开编辑 DeleteView.LayoutParams layoutParams = new DeleteView.LayoutParams(920, 180); layoutParams.leftMargin = 0; holder.ll_content.setLayoutParams(layoutParams); ((DeleteView) convertView).setEnAbleHorizontalScroll(false); //如果滑动从右到左(把删除漏出来),同时点击了编辑按钮,删除position中的所有position if (positions.size() > 0) { for (int i = positions.size() - 1; i >= 0; i--) { positions.remove(i); } } } else {// 未打开编辑 DeleteView.LayoutParams layoutParams = new DeleteView.LayoutParams(920, 180); layoutParams.leftMargin = -80; holder.ll_content.setLayoutParams(layoutParams); ((DeleteView) convertView).setEnAbleHorizontalScroll(true); }
效果很理想,记得运行demo时用720x1280的屏幕
下载地址:http://download.csdn.net/detail/u012123938/9516209
相关文章推荐
- 使用HorizontalScrollView和ImageView编写简单的图片展示程序
- ScrollView和HorizontalScrollView的用法
- HorizontalScrollView动态添加子view,并且设置每个子view的点击事件
- HorizontalScrollView+viewpager实现仿天天动听ios版和QQ侧边菜单效果
- android仿网易导航栏HorizontalScrollView
- HorizontalScrollView实现多页左右滑动
- Android 自定义 HorizontalScrollView 打造再多图片(控件)也不怕 OOM 的横向滑动效果
- [Android] 快速实现一个可切换Tab标签页的组件
- Android 自定义 HorizontalScrollView 打造再多图片(控件)也不怕 OOM 的横向滑动效果
- Android HorizontalScrollView结合GridView实现类似网易新闻那样的栏目滑动效果
- HorizontalScrollView 替换 过期Gallery 的实用demo
- HorizontalScrollViewQQ侧滑
- Horizontal+ViewPager
- Gallery is deprecated:Gallery 过期了怎么办?(一)
- HorizontalScrollView实现画廊
- 基于HorizontalScrollView的anroid侧滑栏的实现
- 利用HorizontalScrollView加Viewpager实现多个的导航标题栏
- 安卓侧滑菜单制作
- [Android] 带阻尼效果的可拉伸的HorizontalScrollView