Android 用HorizontalScrollView实现ListView的Item滑动删除 ,滑动错乱 冲突
测试于:Android2.2+
对于Android来说按键操作已经在减少,越来越多的手势操作层出不穷,今天介绍一款LIstView的Item滑动删除的实现方式。
原理:
利用HorizontalScrollView可以横向滚动的特点实现滑动,根据动态的设置要展示的区域宽度,使得其余选项操作被挤出屏幕外面,从而实现单条滑动菜单的样式。
实现步骤:
- 实现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>
- 准备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);} }
- 继承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滑动删除 ,滑动错乱 冲突相关推荐
- Android 用HorizontalScrollView实现ListView的Item滑动删除
原理: 利用HorizontalScrollView可以横向滚动的特点实现滑动,根据动态的设置要展示的区域宽度,使得其余选项操作被挤出屏幕外面,从而实现单条滑动菜单的样式. 实现步骤: 实现Listv ...
- android listview 列加id,Android实战开发之ListView同一个item显示2列的实现方法
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Android实战开发中,ListView控件用途十分广泛,各种自定义控件多种多样.当项目要求实现一个2列的商品列表形式的界面,我们首先肯定想到用List ...
- Android学习笔记之ListView与Item的焦点冲突处理
由于ListView的Item需要焦点,Item里面的子控件(如ImageButton,Button,CheckBox等等)也需要焦点的时候,就会出现焦点冲突问题,导致Item无法获得焦点,无法相应I ...
- Android编程之指定ListView的item位置
很多情况,我们需要指定ListView中显示Item的位置,如:当前已经滚动到后面,然后响应某个事件,要ListView回到头部. 代码如下,其中mListView为ListView的对象: priv ...
- Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果
本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17539199) 我在上一篇文章中Android 带你从源码的角度解析 ...
- android 两列菜单,【Android】实战开发之ListView同一个item显示2列的实现方法(仿2列商品列表)...
Android实战开发中,ListView控件用途十分广泛,各种自定义控件多种多样.当项目要求实现一个2列的商品列表形式的界面,我们首先肯定想到用ListView,然后我们可以使用百度的自定义List ...
- Android 使用NineOldAndroids实现绚丽的ListView左右滑动删除Item效果
转载请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/18311877),请尊重他人的辛勤劳动成果,谢谢! 今天还是 ...
- Android取消RecyclerView、ListView、ScrollView、HorizontalScrollView滑动到边缘闪现灰白色水波纹动画
Android取消RecyclerView.ListView.ScrollView.HorizontalScrollView滑动到边缘闪现灰白色水波纹动画 标准的Android RecyclerVie ...
- Android 自定义 HorizontalScrollView 横向滑动效果
自从Gallery被谷歌废弃以后,Google推荐使用ViewPager和HorizontalScrollView来实现Gallery的效果.的确HorizontalScrollView可以实现Gal ...
最新文章
- 【PHP+JS】uploadify3.2 和 Ueditor 修改上传文件 大小!!
- oracle存储while用mysql_oracle存储过程while
- 洛谷模拟赛 数据结构
- 《视频直播技术详解》系列之六:延迟优化
- python messagebox弹窗退出_python 中messagebox使用 做中断调试不错
- ZooKeeper的安装及部署
- bzoj1854: [Scoi2010]游戏 贪心
- .NET之EntityFramework框架运用
- Linux下使用NMON监控、分析系统性能
- 玩转 Spring Boot 集成篇(Actuator、Spring Boot Admin)
- 绿幕抠图-为你的想象插上翅膀
- 计算机程序编辑器中文版,QuickEdit电脑版
- 1分钟让你的App 适配 锤子OneStep
- centos7安装python3.7.4_基于centos7 安装python3.6.4出错的解决方法
- 【AI每日播报】马云启动NASA计划 Intel150亿美元收购Mobileye
- 小猿圈 python学习-细讲数据类型-字典
- Web开发项目 # 2048小游戏
- python主机配置_python 之根据自己的需求配置hostname
- 应用程序无法启动,因为应用程序的并行配置不正确...解决方法
- 电信业服务流程设计--用例图