Android使用SwipeListView实现类似QQ的滑动删除效果

QQ的滑动删除效果很不错,要实现这种效果,可以使用SwipeListView。

1. 下载com.fortysevendeg.swipelistview这个项目(以前GitHub上有,现在GitHub上没有了,百度了很多次才下载到的),导入Eclipse,右键单击,选择Properties->Android,选中Library下面的IsLibrary。

2. 新建一个项目MySwipeListView,加入SwipeListView这个库。

3. 在主窗体里面放入一个SwipeListView控件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical"
  android:paddingBottom="@dimen/activity_vertical_margin"
  android:paddingLeft="@dimen/activity_horizontal_margin"
  android:paddingRight="@dimen/activity_horizontal_margin"
  android:paddingTop="@dimen/activity_vertical_margin"
  tools:context="com.hzhi.myswipelistview.MainActivity" >

    <com.fortysevendeg.swipelistview.SwipeListView
      xmlns:swipe="http://schemas.android.com/apk/res-auto"
      android:id="@+id/exampleSwipeListView"
      android:listSelector="#00000000"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      swipe:swipeBackView="@+id/back"
      swipe:swipeCloseAllItemsWhenMoveList="true"
      swipe:swipeDrawableChecked="@drawable/choice_selected"
      swipe:swipeDrawableUnchecked="@drawable/choice_unselected"
      swipe:swipeFrontView="@+id/front"
      swipe:swipeMode="both"
      swipe:swipeActionLeft="reveal"
      swipe:swipeActionRight="dismiss"
      swipe:swipeOpenOnLongPress="true"
    />

</LinearLayout>

其中两个重要的属性:
swipe:swipeFrontView:上面的View,即不滑动时显示的View。
swipe:swipeBackView:下面的View,即滑动后显示的View。
这两个View都定义在SwipeListView的行布局文件里面:

<?xml version="1.0" encoding="utf-8"?>

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
    >

  <LinearLayout
    android:id="@+id/back"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="#ffcccccc"
    android:gravity="right"
    android:tag="back" >

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btn_delete"
        android:text="删除"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btn_update"
        android:text="更新"/>

  </LinearLayout>

  <RelativeLayout
      android:orientation="vertical"
      android:id="@+id/front"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:background="#ffffffff"
  >

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/example_row_iv_image"/>

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/example_row_iv_image"
        android:id="@+id/example_row_tv_title"/>

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/example_row_iv_image"
        android:layout_below="@id/example_row_tv_title"
        android:id="@+id/example_row_tv_description"/>

  </RelativeLayout>  

</FrameLayout>

SwipeListView的行布局文件使用FrameLayout布局,FrameLayout里面所有的所有子元素都堆叠在FrameLayout的左上角。

4. SwipeListView和其他ListView一样,也需要Adapter,使用方法也是一样的。这里就不详细讲了。

5. 在主窗体Java文件中实现SwipeListView的功能,代码如下:

package com.hzhi.myswipelistview;

import android.support.v7.app.ActionBarActivity;
import android.util.Log;

import java.util.ArrayList;

import com.fortysevendeg.swipelistview.BaseSwipeListViewListener;
import com.fortysevendeg.swipelistview.SwipeListView;

import android.os.Bundle;

@SuppressWarnings("deprecation")
public class MainActivity extends ActionBarActivity {

  protected static final String TAG = "MySwipeListView";
  private ArrayList<String> mList;
  private MyAdapter mAdapter;
  private SwipeListView mSwipeListView;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    initData();
    mSwipeListView = (SwipeListView) findViewById(R.id.exampleSwipeListView);
    mAdapter = new MyAdapter(this, mList, mSwipeListView);
    mSwipeListView.setAdapter(mAdapter);

    mSwipeListView.setSwipeListViewListener(new BaseSwipeListViewListener(){
      @Override
      public void onChoiceChanged(int position, boolean selected)
      {
        Log.d(TAG, "onChoiceChanged:" + position + ", " + selected);
      } 

      @Override
      public void onChoiceEnded()
      {
        Log.d(TAG, "onChoiceEnded");
      } 

      @Override
      public void onChoiceStarted()
      {
        Log.d(TAG, "onChoiceStarted");
      } 

      @Override
      public void onClickBackView(int position)
      {
        Log.d(TAG, "onClickBackView:" + position);
      } 

      @Override
      public void onClickFrontView(int position)
      {
        Log.d(TAG, "onClickFrontView:" + position);
      } 

      @Override
      public void onClosed(int position, boolean fromRight)
      {
        Log.d(TAG, "onClosed:" + position + "," + fromRight);
      } 

      @Override
      public void onDismiss(int[] reverseSortedPositions)
      {
        Log.d(TAG, "onDismiss");
      } 

      @Override
      public void onFirstListItem()
      {
        Log.d(TAG, "onFirstListItem");
      } 

      @Override
      public void onLastListItem()
      {
        Log.d(TAG, "onLastListItem");
      } 

      @Override
      public void onListChanged()
      {
        Log.d(TAG, "onListChanged");
        mSwipeListView.closeOpenedItems(); 

      } 

      @Override
      public void onMove(int position, float x)
      {
        Log.d(TAG, "onMove:" + position + "," + x);
      } 

      @Override
      public void onOpened(int position, boolean toRight)
      {
        Log.d(TAG, "onOpened:" + position + "," + toRight);
      } 

      @Override
      public void onStartClose(int position, boolean right)
      {
        Log.d(TAG, "onStartClose:" + position + "," + right);
      } 

      @Override
      public void onStartOpen(int position, int action, boolean right)
      {
        Log.d(TAG, "onStartOpen:" + position + "," + action + "," + right);
      }
    });

  }

  private void initData(){
    mList = new ArrayList<String>();
    for (int i = 0; i <= 10; i++)
      mList.add("这是第" + i +"条数据!");
  }

}

最主要的代码即mSwipeListView.setSwipeListViewListener(new BaseSwipeListViewListener(){}),通过这行代码,为SwipeListView控件设置了Listener,可以根据自己的需要重载BaseSwipeListViewListener的各种方法。

运行结果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • android自定义View滑动删除效果

    View滑动删除效果图 实现功能 1.可以向左滑动,右侧出现删除 2.向左滑动如果删除出现一大半,松手打开删除,反之关闭删除 3.应用场景           微信消息的删除功能 实现原理 1.外面是一个ListView 2.条目是一个自定义控件继承ViewGroup     1).左边一个TextView,右侧屏幕外也有一个TextView     2).所以继承ViewGroup 实现步骤 1.创建一个SlideDeleteView类 1).构造方法要关联 public class Slid

  • Android ListView实现上拉加载下拉刷新和滑动删除功能

    最近项目需要用到可以滑动删除并且带有上拉加载下拉刷新的Listview,查阅了一些资料,大多都是在SwipeMenuListView的基础上去添加头部和底部View,来扩展上拉加载和下拉刷新的功能,不过需要手动的去绘制UI及处理一些动画效果.用起来也不是特别方便.刚好项目中用到PulltorefreshLibrary库,就尝试着扩展了一个PullToRefreshSwipeMenuListView类来实现需求.先看一下效果: 实现步骤 一.组合Pulltorefresh与SwipeMenuLis

  • android RecyclerView侧滑菜单,滑动删除,长按拖拽,下拉刷新上拉加载

    本文介绍的库中的侧滑效果借鉴自SwipeMenu,并对SipwMenu的源码做了修改与Bug修复,然后才开发出的SwipeRecyclerView. 需要说明的是,本库没有对RecyclerView做大的修改,只是ItemView的封装.看起来是对RecyclerView的修改,其实仅仅是为RecyclerView添加了使用的方法API而已. 本库已经更新了三个版本了,会一直维护下去,根据小伙伴的要求,以后也会添加一些其它功能. SwipeRecyclerView将完美解决这些问题: 以下功能全

  • Android仿微信列表滑动删除 如何实现滑动列表SwipeListView

    接上一篇,本篇主要讲如何实现滑动列表SwipeListView. 上篇完成了滑动控件SwipeItemView,这个控件是一个自定义的ViewGroup,作为列表的一个item,为列表提供一些方法让这个SwipeItemView能滑动其视图内容,同时滑动过程中会有顺滑的动画效果.而本篇讲的SwipeListView则是这个列表的具体实现了.当然啦,这个SwipeListView继承自ListView,为了实现我们需要的功能,重点就是重写ListView的onTouchEvent()以及onInt

  • Android RecyclerView滑动删除和拖动排序

    本篇是接着上面三篇之后的一个对RecyclerView的介绍,这里多说两句,如果你还在使用ListView的话,可以放弃掉ListView了.RecyclerView自动帮我们缓存Item视图(ViewHolder),允许我们自定义各种动作的动画和分割线,允许我们对Item进行一些手势操作.另外,因为Design库的推出大大方便我们编写带有Material风格的App,而ListView是不兼容这个库的,比如滑动的相互协调,只有RecyclerView能做到. 先看本篇内容的效果图: 效果内容主

  • android RecyclerView实现条目Item拖拽排序与滑动删除

    效果演示 需求和技术分析 RecyclerView Item拖拽排序::长按RecyclerView的Item或者触摸Item的某个按钮. RecyclerView Item滑动删除:RecyclerView Item滑动删除:RecyclerView的Item滑动删除. 实现方案与技术 利用ItemTouchHelper绑定RecyclerView.ItemTouchHelper.Callback来实现UI更新,并且实现动态控制是否开启拖拽功能和滑动删除功能. 实现步骤 继承抽象类ItemTo

  • Android程序开发之ListView 与PopupWindow实现从左向右滑动删除功能

    文章实现的功能是:在ListView的Item上从右向左滑时,出现删除按钮,点击删除按钮把Item删除. 看过文章后,感觉没有必要把dispatchTouchEvent()和onTouchEvent()两个方法都重写,只要重写onTouchEvent就好了.于是对代码作了一些调整: public class MyListView extends ListView { private static final String TAG = "MyListView"; private int

  • Android中RecyclerView实现滑动删除与拖拽功能

    前言 从Android 5.0开始,谷歌推出了新的控件RecyclerView,相对于早它之前的ListView,优点多多,功能强大,也给我们的开发着提供了极大的便利,今天自己学习一下RecyclerView轻松实现滑动删除及拖拽的效果. 如下图. 相信研究过RecyclerView的同学,应该很清楚该怎么实现这样的效果,若是用ListView,这样的效果实现起来可能就有点麻烦,但是在强大的RecyclerView面前这样的的效果只需很少的代码,因为谷歌给我们提供了强大的工具类ItemTouch

  • Android ListView滑动删除操作(SwipeListView)

    新版本的微信和QQ上引入的滑动删除功能是现在比较流行的一个功能.其实这个滑动删除的控件,github上已经有了,是一个热门的开源框架SwipeListView.不过,这个SwipeListView是一个framelayout,即是一个两层的布局,上面的布局front覆盖了下面的布局back,滑动的时候则会滑开front,这样下面的back就显示出来了.但是看了一下微信的滑动删除好像不是这样的,感觉更像是一个超出了屏幕的单层布局,滑动的时候是右边超出屏幕的button进入屏幕,猜测应该不是使用Sw

  • Android实现ListView左右滑动删除和编辑

    有时候,为了实现项目中的需求,完成设计好的用户交互体验,不的不把这些View重新改造成自己想要的效果. Android原生的ListView是不支持左右滑动的,但是看到微信电话本上,联系人可以左右滑动进行操作的,就通过自己的设想和思路,并加以实现了. 思路: 1.获取到手指放到屏幕时的x,y位置,并判断点击的处于ListView的那个position. 2.判断滑动的方向,如果是上下方向,touch事件就交给ListView处理:如果是左右方向,就禁止ListView进行滑动. 3.根据手指的移

随机推荐