用HorizontalScrollView实现类似微信的滑动删除

测试于:Android2.2+

对于Android来说按键操作已经在减少,越来越多的手势操作层出不穷,今天介绍一款LIstView的Item滑动删除的实现方式。

原理:

利用HorizontalScrollView可以横向滚动的特点实现滑动,根据动态的设置要展示的区域宽度,使得其余选项操作被挤出屏幕外面,从而实现单条滑动菜单的样式。

实现步骤:

  1. 实现Listview的Item布局文件item_list.layout

    <?xml version="1.0" encoding="utf-8"?>
    <HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/hsv"android:layout_width="wrap_content"android:layout_height="80dip"android:scrollbars="none" ><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="match_parent"android:orientation="horizontal" ><LinearLayoutandroid:id="@+id/ll_content"android:layout_width="match_parent"android:layout_height="match_parent" ><TextViewandroid:id="@+id/tv"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:text="" /></LinearLayout><LinearLayoutandroid:id="@+id/ll_action"android:layout_width="wrap_content"android:layout_height="match_parent"android:orientation="horizontal" ><Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="match_parent"android:background="@android:color/darker_gray"android:paddingLeft="20dip"android:paddingRight="20dip"android:text="@string/action1" /><Buttonandroid:id="@+id/button2"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_marginLeft="2dip"android:layout_marginRight="2dip"android:background="@android:color/darker_gray"android:paddingLeft="20dip"android:paddingRight="20dip"android:text="@string/action2" /><Buttonandroid:id="@+id/button3"android:layout_width="wrap_content"android:layout_height="match_parent"android:background="@android:color/darker_gray"android:paddingLeft="20dip"android:paddingRight="20dip"android:text="@string/action3" /></LinearLayout></LinearLayout></HorizontalScrollView>
  2. 准备MainActivity初始化Listview
    package com.yzy.horizontalscrollview;import android.app.Activity;
    import android.os.Bundle;
    import android.util.DisplayMetrics;
    import android.widget.ListView;
    import com.yzy.horizontalscrollview.R;public class MainActivity extends Activity {private ListView mListView;private MyAdapter mAdapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mListView = (ListView) findViewById(R.id.listView);DisplayMetrics dm = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(dm);mAdapter = new MyAdapter(this, dm.widthPixels);mListView.setAdapter(mAdapter);}
    }
  3. 继承BaseAdapter实现自定义的适配器MyAdapter
    package com.yzy.horizontalscrollview;import java.util.ArrayList;
    import java.util.List;import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.ViewGroup.LayoutParams;
    import android.widget.BaseAdapter;
    import android.widget.Button;
    import android.widget.HorizontalScrollView;
    import android.widget.TextView;
    import com.yzy.horizontalscrollview.R;public class MyAdapter extends BaseAdapter implements View.OnClickListener {// 数据源,用于存放颜色值的。private List<Integer> colors;private Context mContext;// 屏幕宽度,由于我们用的是HorizontalScrollView,所以按钮选项应该在屏幕外private int mScreentWidth;private View view;/*** 构造方法* * @param context* @param screenWidth*/public MyAdapter(Context context, int screenWidth) {// 初始化mContext = context;mScreentWidth = screenWidth;// 填充list的内容模拟数据,否则应该异步执行colors = new ArrayList<Integer>();for (int i = 0; i < 15; i++) {colors.add(R.color.blue);}}@Overridepublic int getCount() {return colors.size();}@Overridepublic Object getItem(int position) {return colors.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder;// 如果没有设置过,初始化convertViewif (convertView == null) {// 获得设置的viewconvertView = LayoutInflater.from(mContext).inflate(R.layout.item_list, parent, false);// 初始化holderholder = new ViewHolder();holder.hSView = (HorizontalScrollView) convertView.findViewById(R.id.hsv);holder.action = convertView.findViewById(R.id.ll_action);holder.btOne = (Button) convertView.findViewById(R.id.button1);holder.btTwo = (Button) convertView.findViewById(R.id.button2);holder.btThree = (Button) convertView.findViewById(R.id.button3);holder.tvContent = (TextView) convertView.findViewById(R.id.tv);// 设置内容view的大小为屏幕宽度,这样按钮就正好被挤出屏幕外holder.content = convertView.findViewById(R.id.ll_content);LayoutParams lp = holder.content.getLayoutParams();lp.width = mScreentWidth;convertView.setTag(holder);} else {// 有直接获得ViewHolderholder = (ViewHolder) convertView.getTag();}// 把位置放到view中,这样点击事件就可以知道点击的是哪一条itemholder.btOne.setTag(position);holder.btTwo.setTag(position);holder.btThree.setTag(position);// 设置监听事件convertView.setOnTouchListener(new View.OnTouchListener(){@Overridepublic boolean onTouch(View v, MotionEvent event){switch (event.getAction()){case MotionEvent.ACTION_DOWN:if (view != null) {ViewHolder viewHolder1 = (ViewHolder) view.getTag();viewHolder1.hSView.smoothScrollTo(0, 0);}case MotionEvent.ACTION_UP:// 获得ViewHolderViewHolder viewHolder = (ViewHolder) v.getTag();view = v;// 获得HorizontalScrollView滑动的水平方向值.int scrollX = viewHolder.hSView.getScrollX();// 获得操作区域的长度int actionW = viewHolder.action.getWidth();// 注意使用smoothScrollTo,这样效果看起来比较圆滑,不生硬// 如果水平方向的移动值<操作区域的长度的一半,就复原if (scrollX < actionW / 2){viewHolder.hSView.smoothScrollTo(0, 0);}else// 否则的话显示操作区域{viewHolder.hSView.smoothScrollTo(actionW, 0);}return true;}return false;}});// 这里防止删除一条item后,ListView处于操作状态,直接还原if (holder.hSView.getScrollX() != 0) {holder.hSView.scrollTo(0, 0);}// 设置背景颜色,设置填充内容.holder.content.setBackgroundResource(colors.get(position));holder.tvContent.setText("" + position);// 设置监听事件holder.btOne.setOnClickListener(this);holder.btTwo.setOnClickListener(this);holder.btThree.setOnClickListener(this);return convertView;}/*** ViewHolder* * @Title:* @Description:主要是避免了不断的view获取初始化.* @Author:yzy* @Since:2013-10-22*/class ViewHolder {public HorizontalScrollView hSView;public View content;public TextView tvContent;public View action;public Button btOne;public Button btTwo;public Button btThree;}@Overridepublic void onClick(View v) {int position = (Integer) v.getTag();switch (v.getId()) {case R.id.button1:colors.add(R.color.blue);break;case R.id.button2:colors.remove(position);break;case R.id.button3:if (colors.get(position) == R.color.blue) {colors.set(position, R.color.red);} else {colors.set(position, R.color.blue);}break;default:break;}// 刷新ListView内容notifyDataSetChanged();}
    }

效果图:

还有很多的实现方式,希望大家多多指教哦,附件里面是源码本人测试通过的。

下载:ListViewHorizontalScrollview.zip

最近在开发中遇到HorizontalScrollView嵌套ScrollView导致滑动卡的情况,急横向水平滑动的View和垂直水平滑动的View,都在接收处理滑动时间,但是这种情况下触摸事件就会发生冲突。导致滑动非常卡,甚至出现程序停止响应。这种情况下我们需要重写view。下面是两个简单的例子,重写水平滑动View只接收水平方向上滑动的事件。我们使用手势GestureDetector来作区分

import android.content.Context;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.widget.HorizontalScrollView;

public class CustomHScrollView extends HorizontalScrollView{private GestureDetector mGestureDetector;
    private View.OnTouchListener mGestureListener;

    private static final String TAG = "CustomHScrollView";

    /**
     * @function CustomHScrollView constructor
     * @param context Interface to global information about an application environment.
     *
     */
    public CustomHScrollView(Context context) {super(context);
// TODO Auto-generated constructor stub
        mGestureDetector = new GestureDetector(new HScrollDetector());
        setFadingEdgeLength(0);
    }/**
     * @function CustomHScrollView constructor
     * @param context Interface to global information about an application environment.
     * @param attrs A collection of attributes, as found associated with a tag in an XML document.
     */
    public CustomHScrollView(Context context, AttributeSet attrs) {super(context, attrs);
// TODO Auto-generated constructor stub
        mGestureDetector = new GestureDetector(new HScrollDetector());
        setFadingEdgeLength(0);
    }/**
     * @function CustomHScrollView constructor
     * @param context Interface to global information about an application environment.
     * @param attrs A collection of attributes, as found associated with a tag in an XML document.
     * @param defStyle style of view
     */
    public CustomHScrollView(Context context, AttributeSet attrs,
                             int defStyle) {super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
        mGestureDetector = new GestureDetector(new HScrollDetector());
        setFadingEdgeLength(0);
    }@Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {return super.onInterceptTouchEvent(ev) && mGestureDetector.onTouchEvent(ev);
    }// Return false if we're scrolling in the y direction
    class HScrollDetector extends SimpleOnGestureListener {@Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {if(Math.abs(distanceX) > Math.abs(distanceY)) {return true;
            }return false;
        }}}
       

Android 用HorizontalScrollView实现ListView的Item滑动删除 ,滑动错乱 冲突相关推荐

  1. Android 用HorizontalScrollView实现ListView的Item滑动删除

    原理: 利用HorizontalScrollView可以横向滚动的特点实现滑动,根据动态的设置要展示的区域宽度,使得其余选项操作被挤出屏幕外面,从而实现单条滑动菜单的样式. 实现步骤: 实现Listv ...

  2. android listview 列加id,Android实战开发之ListView同一个item显示2列的实现方法

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Android实战开发中,ListView控件用途十分广泛,各种自定义控件多种多样.当项目要求实现一个2列的商品列表形式的界面,我们首先肯定想到用List ...

  3. Android学习笔记之ListView与Item的焦点冲突处理

    由于ListView的Item需要焦点,Item里面的子控件(如ImageButton,Button,CheckBox等等)也需要焦点的时候,就会出现焦点冲突问题,导致Item无法获得焦点,无法相应I ...

  4. Android编程之指定ListView的item位置

    很多情况,我们需要指定ListView中显示Item的位置,如:当前已经滚动到后面,然后响应某个事件,要ListView回到头部. 代码如下,其中mListView为ListView的对象: priv ...

  5. Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果

    本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17539199) 我在上一篇文章中Android 带你从源码的角度解析 ...

  6. android 两列菜单,【Android】实战开发之ListView同一个item显示2列的实现方法(仿2列商品列表)...

    Android实战开发中,ListView控件用途十分广泛,各种自定义控件多种多样.当项目要求实现一个2列的商品列表形式的界面,我们首先肯定想到用ListView,然后我们可以使用百度的自定义List ...

  7. Android 使用NineOldAndroids实现绚丽的ListView左右滑动删除Item效果

    转载请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/18311877),请尊重他人的辛勤劳动成果,谢谢! 今天还是 ...

  8. Android取消RecyclerView、ListView、ScrollView、HorizontalScrollView滑动到边缘闪现灰白色水波纹动画

    Android取消RecyclerView.ListView.ScrollView.HorizontalScrollView滑动到边缘闪现灰白色水波纹动画 标准的Android RecyclerVie ...

  9. Android 自定义 HorizontalScrollView 横向滑动效果

    自从Gallery被谷歌废弃以后,Google推荐使用ViewPager和HorizontalScrollView来实现Gallery的效果.的确HorizontalScrollView可以实现Gal ...

最新文章

  1. 【PHP+JS】uploadify3.2 和 Ueditor 修改上传文件 大小!!
  2. oracle存储while用mysql_oracle存储过程while
  3. 洛谷模拟赛 数据结构
  4. 《视频直播技术详解》系列之六:延迟优化
  5. python messagebox弹窗退出_python 中messagebox使用 做中断调试不错
  6. ZooKeeper的安装及部署
  7. bzoj1854: [Scoi2010]游戏 贪心
  8. .NET之EntityFramework框架运用
  9. Linux下使用NMON监控、分析系统性能
  10. 玩转 Spring Boot 集成篇(Actuator、Spring Boot Admin)
  11. 绿幕抠图-为你的想象插上翅膀
  12. 计算机程序编辑器中文版,QuickEdit电脑版
  13. 1分钟让你的App 适配 锤子OneStep
  14. centos7安装python3.7.4_基于centos7 安装python3.6.4出错的解决方法
  15. 【AI每日播报】马云启动NASA计划 Intel150亿美元收购Mobileye
  16. 小猿圈 python学习-细讲数据类型-字典
  17. Web开发项目 # 2048小游戏
  18. python主机配置_python 之根据自己的需求配置hostname
  19. 应用程序无法启动,因为应用程序的并行配置不正确...解决方法
  20. 电信业服务流程设计--用例图

热门文章

  1. 鼠标切换虚拟桌面 autohotkey
  2. PS制作一个百度的小熊掌LOGO
  3. Go-Proxy-Checker,一款基于Go编写的高性能代理服务器验证工具
  4. Cobalt Strike上线微信机器人提醒
  5. IP交换机与路由器配置
  6. 如何解决wup.exe文件占用cpu资源
  7. 递归实现树状分级部门树《部门单表》
  8. Excel制作热力图
  9. 论ArcGIS10.2的Band Collection Statistics工具计算相关系数的正确性
  10. CYK 算法 Python 实现