Android RecyclerViewSwipeDismiss:水平、垂直方向的拖曳删除item

RecyclerViewSwipeDismiss是一种支持RecyclerView的水平、垂直方向拖曳删除RecyclerView里面条目item的第三方开源项目,RecyclerViewSwipeDismiss在gitbub上的项目主页是:https://github.com/CodeFalling/RecyclerViewSwipeDismiss


我在以前写过类似的项目内容,最典型的就是腾讯QQ的消息列表,见附录文章1所简介,QQ的消息列表中某一个条目左滑以后会滑出一系列选项,比如删除、置顶等。同样,也有像附录文章2那样左滑右滑可以删除ListView内容的开源项目。

这篇文章要介绍的RecyclerViewSwipeDismiss,除了支持RecyclerView这个最新的“ListView”外,RecyclerViewSwipeDismiss还支持垂直方向的上滑/下滑,以及水平方向的左滑/右滑删除,这和附录文章1,2的开源项目相比较有其应用场景特色,假设有一个水平方向的RecyclerView,那么我可以设置成垂直方向的滑动删除;假设是一个垂直方向的RecyclerView,那么我可以设置成水平方向的左滑/右滑删除。

写一个简单的例子,测试的MainActivity.java:

package zhangphil.demo;

import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast; import java.util.LinkedList;
import java.util.List; import io.github.codefalling.recyclerviewswipedismiss.SwipeDismissRecyclerViewTouchListener; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); final RecyclerView mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView); LinearLayoutManager horizontalLayoutManager = new LinearLayoutManager(this);
horizontalLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
mRecyclerView.setLayoutManager(horizontalLayoutManager); List<String> data = new LinkedList<String>();
for (int i = 0; i < 100; i++)
data.add("数据:" + i); final MyAdapter adapter = new MyAdapter(data);
mRecyclerView.setAdapter(adapter); SwipeDismissRecyclerViewTouchListener listener = new SwipeDismissRecyclerViewTouchListener.Builder(
mRecyclerView,
new SwipeDismissRecyclerViewTouchListener.DismissCallbacks() {
@Override
public boolean canDismiss(int position) {
return true;
} @Override
public void onDismiss(View view) {
int id = mRecyclerView.getChildPosition(view);
adapter.data.remove(id);
adapter.notifyDataSetChanged();
Toast.makeText(getApplication(), String.format("删除 %d", id), Toast.LENGTH_SHORT).show();
}
})
.setIsVertical(true) /**true为垂直方向拖曳删除,如果是false,那么是水平方向的拖曳删除*/
.create(); mRecyclerView.setOnTouchListener(listener);
} public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> { public List<String> data; public MyAdapter(List<String> data) {
super();
this.data = data;
} @Override
public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view = View.inflate(viewGroup.getContext(), android.R.layout.simple_list_item_1, null);
MyViewHolder holder = new MyViewHolder(view);
return holder;
} @Override
public void onBindViewHolder(MyViewHolder viewHolder, int i) {
viewHolder.mTextView.setText(data.get(i));
} @Override
public int getItemCount() {
return data.size();
}
} private class MyViewHolder extends RecyclerView.ViewHolder {
public TextView mTextView; public MyViewHolder(View itemView) {
super(itemView);
mTextView = (TextView) itemView;
}
}
}

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical" /> </RelativeLayout>

运行结果:

在设计时候要注意一些常识,比如,如果设计的是一个水平的RecyclerView,那么比较自然的滑动删除方向是垂直的上滑/下滑;而如果是一个垂直方向的RecyclerView,那么比较自然的滑动删除方向是水平的左滑/右滑。RecyclerViewSwipeDismiss通过setIsVertical(boolean b)布尔值控制,true为垂直方向的上下滑动删除,false则是水平方向的左右滑动删除,开发者应该设计相配套的RecyclerView方向。

附录文章:

1,《Android SwipeMenuListView》链接地址:http://blog.csdn.net/zhangphil/article/details/46999127


2,《Android SwipeToDismiss:左滑/右滑删除ListView条目Item》链接地址:http://blog.csdn.net/zhangphil/article/details/47081863

Android RecyclerViewSwipeDismiss:水平、垂直方向的拖曳删除item的更多相关文章

  1. Android RecyclerView(瀑布流)水平/垂直方向分割线

     Android RecyclerView(瀑布流)水平/垂直方向分割线 Android RecyclerView不像过去的ListView那样随意的设置水平方向的分割线,如果要实现Recycle ...

  2. css 元素水平垂直方向居中

    html部分 <div class="parent"> <div class="child"> - -居中- - </div> ...

  3. 小div在大div里面水平垂直都居中的实现方法

    关于如何设置小盒子在大盒子里面水平垂直方向同时居中的实现方法有很多种,下面仅列举了常用的几种. 首先看一下要实现的效果图及对应的html代码: <div class="parent&q ...

  4. HTML-移动端如何使用css让百分比布局的弹窗水平和垂直方向上居中

    pc端让一个弹窗水平和垂直方向居中,在知道弹窗宽高的情况下很好计算,只需要用如下css即可: #date{ width: 300px; height: 300px; position: absolut ...

  5. CSS居中问题:块级元素和行级元素在水平方向以及垂直方向的居中问题

    元素的居中问题是每个初学者碰到的第一个大问题,在此我总结了下各种块级 行级 水平 垂直 的居中方法,并尽量给出代码实例. 首先请先明白块级元素和行级元素的区别 块级元素 块级元素水平居中 1:marg ...

  6. div里面的元素在【垂直 方向】上水平分布 使用calc()函数动态计算

    1==>如何让div里面的元素在[垂直 方向]上水平分布.important-dec{ height: 121px; //必须固定高度 flex-direction: column; //垂直排 ...

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

    本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/18311877) 今天还是给大家带来自定义控件的编写,自定义一个Lis ...

  8. 《在纹线方向上进行平滑滤波,在纹线的垂直方向上进行锐化滤波》 --Gabor增强的具体实践

    <在纹线方向上进行平滑滤波,在纹线的垂直方向上进行锐化滤波>                                          --Gabor增强的具体实践     一.问 ...

  9. 禁止uiscrollview垂直方向滚动,只允许水平方向滚动;或只允许垂直方向滚动

    禁止UIScrollView垂直方向滚动,只允许水平方向滚动 scrollview.contentSize =  CGSizeMake(你要的长度, 0); 禁止UIScrollView水平方向滚动, ...

随机推荐

  1. 统计ES性能的python脚本

    思路:通过http请求获取es集群中某一index的索引docs数目变化来进行ES性能统计 import time from datetime import datetime import urlli ...

  2. windows 下 opencv 3.x 的安装及常见问题的解决

    1. 下载与配置 下载地址:Releases - OpenCV library(选择合适的平台和版本) 配置步骤见:VS 2013 统一修改所有工程的目录配置(以 boost.opencv3 的安装为 ...

  3. 【Kafka】《Kafka权威指南》——从Kafka读取数据

    应用程序使用 KafkaConsumer向 Kafka 订阅主题,并从订阅的主题上接收消息 . 从 Kafka 读取数据不同于从其他悄息系统读取数据,它涉及一些独特的概念和想法.如果不先理解 这些概念 ...

  4. Django总结二

    - 创建app应用与ORM操作 - Django项目project - app(应用) -> 不同的功能放在不同的app中 - 命令 : - 创建app python manage.py sta ...

  5. 【洛谷3546_BZOJ2803】[POI2012]PRE-Prefixuffix(String Hash)

    Problem: 洛谷3546 Analysis: I gave up and saw other's solution when I had nearly thought of the method ...

  6. [LeetCode]152. Maximum Product Subarray

    This a task that asks u to compute the maximum product from a continue subarray. However, you need t ...

  7. Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'empid' in 'class cn.happy.entity.Emp'

    org.apache.ibatis.exceptions.PersistenceException: ### Error querying database.  Cause: org.apache.i ...

  8. 原生js实现简单的焦点图效果

    用到一些封装好的运动函数,主要是定时器 效果为图片和图片的描述定时自动更换 <!DOCTYPE html> <html> <head> <meta chars ...

  9. [原创]Toolbar setNavigationIcon无效

    最近在做一个Toolbar,setNavigationIcon()这个方法一直无效,说什么的都有,什么getSupportActionBar().setNavigationIcon()的,说设置sty ...

  10. 一,前端---关于微信小程序遇到的wx.request({})问题

    域名请求错误问题 当我们在编写小程序,要发送请求时,wx.request({})时或许会遇到如下的问题: 一:这是因为微信小程序的开发中,域名只能是https方式请求,所以我们必须在小程序微信公众平台 ...