iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么在Android中利用ListView实现一个侧滑删除功能
  • 823
分享到

怎么在Android中利用ListView实现一个侧滑删除功能

androidlistviewroi 2023-05-31 09:05:39 823人浏览 泡泡鱼
摘要

本篇文章给大家分享的是有关怎么在Android中利用ListView实现一个侧滑删除功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。需求:listView可以侧滑item,展

本篇文章给大家分享的是有关怎么在Android中利用ListView实现一个侧滑删除功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

需求:

listView可以侧滑item,展示删除按钮,点击删除按钮,删除当前的item

在删除按钮展示时,点击隐藏删除按钮,不响应item的点击事件

在删除按钮隐藏时,点击item响应点击事件

根据以上需求在网络上查找响应的例子,也有仿QQ侧滑代码,但不能满足2和3的要求,因此修改了一把,代码如下,共大家拍砖

第一步:重写ListView

public class SwipeListView extends ListView {  private final static String TAG = "SwipeListView";  private int mScreenWidth;  // 屏幕宽度  private int mDownX;      // 按下点的x值  private int mDownY;      // 按下点的y值  private int mDeleteBtnWidth;// 删除按钮的宽度  private boolean isDeleteShown = false;  // 删除按钮是否正在显示  private boolean isOnClick = false;  private ViewGroup mPointChild;  // 当前处理的item  private LinearLayout.LayoutParams mLayoutParams;  // 当前处理的item的LayoutParams  public SwipeListView(Context context, AttributeSet attrs) {    this(context, attrs, 0);  }  public SwipeListView(Context context, AttributeSet attrs, int defStyle) {    super(context, attrs, defStyle);    // 获取屏幕宽度    WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);    DisplayMetrics dm = new DisplayMetrics();    wm.getDefaultDisplay().getMetrics(dm);    mScreenWidth = dm.widthPixels;  }  @Override  public boolean onTouchEvent(MotionEvent ev) {    switch (ev.getAction()) {      case MotionEvent.ACTION_DOWN:        perforMactionDown(ev);        break;      case MotionEvent.ACTION_MOVE:        return perfORMActionMove(ev);      case MotionEvent.ACTION_UP:        return performActionUp(ev);//        break;    }    return super.onTouchEvent(ev);  }  // 处理action_down事件  private void performActionDown(MotionEvent ev) {//    Log.e(TAG,"performActionDown===="+isDeleteShown);    if (isDeleteShown) {      turnToNormal();    }    isOnClick = true;    mDownX = (int) ev.getX();    mDownY = (int) ev.getY();    // 获取当前点的item    int downPosition = pointToPosition(mDownX, mDownY);    int firstPosition= getFirstVisiblePosition();    Log.e(TAG,"performActionDown====downPosition:"+downPosition+"==firstPosition"+firstPosition);    if(downPosition < 0) return;    mPointChild = (ViewGroup) getChildAt(downPosition-firstPosition);    // 获取删除按钮的宽度    mDeleteBtnWidth = mPointChild.getChildAt(1).getLayoutParams().width;    mLayoutParams = (LinearLayout.LayoutParams) mPointChild.getChildAt(0)        .getLayoutParams();    // 为什么要重新设置layout_width 等于屏幕宽度    // 因为match_parent时,不管你怎么滑,都不会显示删除按钮    // why? 因为match_parent时,ViewGroup就不去布局剩下的view    mLayoutParams.width = mScreenWidth;    mPointChild.getChildAt(0).setLayoutParams(mLayoutParams);  }  // 处理action_move事件  private boolean performActionMove(MotionEvent ev) {//    Log.e(TAG, "performActionMove====" + isDeleteShown);    int nowX = (int) ev.getX();    int nowY = (int) ev.getY();    isOnClick = false;    if (Math.abs(nowX - mDownX) > Math.abs(nowY - mDownY)) {      // 如果向左滑动      if (nowX < mDownX) {        // 计算要偏移的距离        int scroll = (nowX - mDownX) / 2;        // 如果大于了删除按钮的宽度, 则最大为删除按钮的宽度        if (-scroll >= mDeleteBtnWidth) {          scroll = -mDeleteBtnWidth;        }        // 重新设置leftMargin        mLayoutParams.leftMargin = scroll;        mPointChild.getChildAt(0).setLayoutParams(mLayoutParams);      }      return true;    }    return super.onTouchEvent(ev);  }  // 处理action_up事件  private boolean performActionUp(MotionEvent ev) {    boolean falg = false;    if(isOnClick && !isDeleteShown)    {      falg = true;    }    // 偏移量大于button的一半,则显示button    // 否则恢复默认    if (-mLayoutParams.leftMargin >= mDeleteBtnWidth / 2) {      mLayoutParams.leftMargin = -mDeleteBtnWidth;      isDeleteShown = true;    } else {      turnToNormal();      isDeleteShown = false;    }    mPointChild.getChildAt(0).setLayoutParams(mLayoutParams);//    Log.e(TAG, "performActionUp====" + isDeleteShown);    if(falg)    {      return super.onTouchEvent(ev);    }    return true;  }    public void turnToNormal() {    mLayoutParams.leftMargin = 0;    mPointChild.getChildAt(0).setLayoutParams(mLayoutParams);  }    public boolean canClick() {    return !isDeleteShown;  }}

第二步:适配器

class SwipeListAdapter extends BaseAdapter {  @Override  public int getCount() {    return mData.size();  }  @Override  public Object getItem(int position) {    return mData.get(position);  }  @Override  public long getItemId(int position) {    return position;  }  @Override  public View getView(int position, View convertView, ViewGroup parent) {    ViewHolder holder = null;    if (null == convertView) {      holder = new ViewHolder();      convertView = View.inflate(TestListViewActivity.this, R.layout.item_swipe_list, null);      holder.tv = (LinearLayout) convertView.findViewById(R.id.tv);      holder.tvName = (TextView) convertView.findViewById(R.id.tv_name);      holder.delete = (TextView) convertView.findViewById(R.id.delete);      convertView.setTag(holder);    }    else {      holder = (ViewHolder) convertView.getTag();    }    holder.tvName.setText(mData.get(position));    final int pos = position;    holder.delete.setOnClickListener(new View.OnClickListener() {      @Override      public void onClick(View v) {        mData.remove(pos);        notifyDataSetChanged();        mListView.turnToNormal();      }    });    return convertView;  }}static class ViewHolder {  LinearLayout tv;  TextView tvName;  TextView delete;}

第三步:写一个TestListViewActivity

private SwipeListView mListView;  private ArrayList<String> mData = new ArrayList<String>() {    {      for (int i = 0; i < 20; i++) {        add("hello world, hello android " + i);      }    }  };  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_test_list_view);    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);    setSupportActionBar(toolbar);    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);    fab.setOnClickListener(new View.OnClickListener() {      @Override      public void onClick(View view) {        Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)            .setAction("Action", null).show();      }    });    mListView = (SwipeListView) findViewById(R.id.list);    mListView.setAdapter(new SwipeListAdapter());//    mListView.setOnItemLonGClickListener(new AdapterView.OnItemLongClickListener() {//      @Override//      public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {//        Toast.makeText(TestListViewActivity.this, mData.get(position) + "被点击了",//            Toast.LENGTH_SHORT).show();//        return false;//      }//    });    mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {      @Override      public void onItemClick(AdapterView<?> parent, View view, int position, long id) {        Log.e("SwipeListView", "setOnItemClickListener====" + mListView.canClick());//        Toast.makeText(TestListViewActivity.this, mData.get(position) + "被点击了",//            Toast.LENGTH_SHORT).show();      }    });  }

第四步:布局文件

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="Http://schemas.android.com/apk/res/android"  xmlns:tools="http://schemas.android.com/tools"  xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent"  android:layout_height="match_parent"   app:layout_behavior="@string/appbar_scrolling_view_behavior"  tools:showIn="@layout/activity_test_list_view"  tools:context="com.kimascend.ledappd1.activity.TestListViewActivity">  <com.kimascend.ledappd1.view.SwipeListView    android:id="@+id/list"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:cacheColorHint="@android:color/transparent"    android:listSelector="@android:color/transparent"    android:divider="@android:color/darker_gray"    android:dividerHeight="2dp">  </com.kimascend.ledappd1.view.SwipeListView></RelativeLayout>

第五步:item的布局文件

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="match_parent"  android:layout_height="wrap_content"  android:orientation="horizontal">  <LinearLayout    android:id="@+id/tv"    android:orientation="horizontal"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:background="@android:color/white"    android:paddingBottom="20dp"    android:paddingLeft="10dp"    android:paddingTop="20dp">    <ImageView      android:layout_width="wrap_content"      android:layout_height="wrap_content"      android:background="@drawable/group_name_rgb"      android:id="@+id/imageView8" />    <TextView      android:layout_width="wrap_content"      android:layout_height="wrap_content"      android:textAppearance="?android:attr/textAppearanceLarge"      android:text="Large Text"      android:layout_gravity="center_vertical"      android:id="@+id/tv_name" />  </LinearLayout>  <TextView    android:id="@+id/delete"    android:layout_width="80dp"    android:layout_height="match_parent"    android:background="#FFFF0000"    android:gravity="center"    android:paddingLeft="20dp"    android:paddingRight="20dp"    android:text="删除"    android:textColor="@android:color/white" /></LinearLayout>

重点注意:

int downPosition = pointToPosition(mDownX, mDownY);

downPosition 在使用过程中得到-1,导致后面方法调用异常!

以上就是怎么在Android中利用ListView实现一个侧滑删除功能,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网精选频道。

--结束END--

本文标题: 怎么在Android中利用ListView实现一个侧滑删除功能

本文链接: https://www.lsjlt.com/news/224819.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么在Android中利用ListView实现一个侧滑删除功能
    本篇文章给大家分享的是有关怎么在Android中利用ListView实现一个侧滑删除功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。需求:listView可以侧滑item,展...
    99+
    2023-05-31
    android listview roi
  • 如何在Android应用中实现一个侧滑功能
    本篇文章给大家分享的是有关如何在Android应用中实现一个侧滑功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。实现说明:通过自定义布局实现:SlidingLayout继承于...
    99+
    2023-05-31
    android roi
  • uniapp怎么实现侧滑删除功能
    近年来,移动应用程序的用户体验已经成为了设计师和开发者越来越重视的领域。使用流畅、易于操作的界面成为应用程序赢得用户青睐的关键所在。侧滑删除作为用户体验的一部分,可以使应用程序的操作更加方便,使用户更快速地找到需要的内容,因此在各种应用程序...
    99+
    2023-05-14
  • Android实现QQ侧滑(删除、置顶等)功能
    实现类似QQ滑动出现可操作项的功能,在网上看到有人自定义LinearLayout实现这个效果,但是灵活性有限。此demo使用开源项目SwipeLayout实现该功能。关于SwipeLayout的常用设置和属性,这里都做介绍,下面进入正题。一...
    99+
    2023-05-30
  • 怎么在android应用中利用view实现一个拖拽删除功能
    这期内容当中小编将会给大家带来有关怎么在android应用中利用view实现一个拖拽删除功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。功能有以下几个特点:在开始的时候点击圆以外的区域不会触发拖动事件点...
    99+
    2023-05-31
    android roi view
  • 怎么在Android中利用DrawerLayout实现一个双向侧滑菜单
    这篇文章将为大家详细讲解有关怎么在Android中利用DrawerLayout实现一个双向侧滑菜单,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。布局文件的代码:<LinearLayou...
    99+
    2023-05-30
  • Android开发中如何实现一个滑动删除功能
    这篇文章将为大家详细讲解有关Android开发中如何实现一个滑动删除功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。先看一下效果activity_lookstaff.xml<Rela...
    99+
    2023-05-31
    android 滑动删除 roi
  • 如何在Android应用中利用ListView实现一个分页功能
    今天就跟大家聊聊有关如何在Android应用中利用ListView实现一个分页功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Android ListView分页简单实现分页,开发...
    99+
    2023-05-31
    android listview roi
  • 怎么在Android应用中利用ListView实现一个监听滑动事件
    怎么在Android应用中利用ListView实现一个监听滑动事件?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。ListView的主要有两种滑动事件监听方法,OnTouchLi...
    99+
    2023-05-31
    listview android roi
  • 怎么在Android中利用ListView实一个汉字转成拼音功能
    本篇文章为大家展示了怎么在Android中利用ListView实一个汉字转成拼音功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。项目结构我按照项目中类的顺序来一一介绍其功能SortModel 一个...
    99+
    2023-05-31
    android listview roi
  • Android开发中怎么在RecyclerView上添加一个滑动删除功能
    Android开发中怎么在RecyclerView上添加一个滑动删除功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。首先更新item的布局(item_main...
    99+
    2023-05-31
    android recyclerview recycle
  • Android开发中利用ListView怎么实现一个分页加载功能
    这期内容当中小编将会给大家带来有关Android开发中利用ListView怎么实现一个分页加载功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。具体如下:package eoe.listview;impo...
    99+
    2023-05-31
    android 分页加载 listview
  • 怎么在android中使用View实现一个滑动删除效果
    这篇文章给大家介绍怎么在android中使用View实现一个滑动删除效果,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。实现功能可以向左滑动,右侧出现删除2、向左滑动如果删除出现一大半,松手打开删除,反之关闭删除3、应用...
    99+
    2023-05-31
    android view roi
  • 怎么在android中利RecycleView添加一个下滑功能
    怎么在android中利RecycleView添加一个下滑功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。RecycleView内部有一个滑动监听的抽象类OnScroll...
    99+
    2023-05-31
    recycleview android recycle
  • 如何在Android中使用RecyclerView实现一个滑动删除
    本篇文章为大家展示了如何在Android中使用RecyclerView实现一个滑动删除,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。ItemTouchHelper.CallbackItemTouch...
    99+
    2023-05-31
    android recyclerview recycle
  • 怎么在Android应用中利用RecycleView 实现一个左滑上下分层功能
    怎么在Android应用中利用RecycleView 实现一个左滑上下分层功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。独立Adapter的操作方式思路: ...
    99+
    2023-05-31
    android recycleview recycle
  • 怎么在Android中实现一个滑动退出Activity功能
    怎么在Android中实现一个滑动退出Activity功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。实现Android 滑动退出Activity的功能and...
    99+
    2023-05-30
    android activity roi
  • 如何在Android中利用View实现一个等级滑动条功能
    这篇文章将为大家详细讲解有关如何在Android中利用View实现一个等级滑动条功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。思路: 首先绘制直线,然后等分直线绘制点; 绘制点...
    99+
    2023-05-31
    android view roi
  • 如何在Android应用中利用DrawerLayout实现一个侧拉菜单栏功能
    如何在Android应用中利用DrawerLayout实现一个侧拉菜单栏功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。activity_main.xml<&#...
    99+
    2023-05-31
    android drawerlayout roi
  • Android中怎么利用item实现长按删除功能
    Android中怎么利用item实现长按删除功能,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一般写完之后都会调用 public void&...
    99+
    2023-05-30
    android item
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作