1、首先在build.gradle里添加

  1. compile 'com.github.mcxtzhang:SwipeDelMenuLayout:V1.2.1'

2、设置recyclerView的item布局

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <com.mcxtzhang.swipemenulib.SwipeMenuLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. xmlns:app="http://schemas.android.com/apk/res-auto"
  5. android:layout_width="match_parent"
  6. android:layout_height="100dp"
  7. android:clickable="true"
  8. android:paddingBottom="1dp"
  9. app:ios="false"
  10. app:leftSwipe="true"
  11. app:swipeEnable="true">
  12.  
  13. <TextView
  14. android:id="@+id/content"
  15. android:layout_width="match_parent"
  16. android:layout_height="match_parent"
  17. android:background="?android:attr/selectableItemBackground"
  18. android:gravity="center"
  19. android:text="项目中我是任意复杂的原Item布局" />
  20.  
  21. <!-- 以下都是侧滑菜单的内容依序排列 -->
  22. <Button
  23. android:id="@+id/btnTop"
  24. android:layout_width="60dp"
  25. android:layout_height="match_parent"
  26. android:background="#d9dee4"
  27. android:text="置顶"
  28. android:textColor="@android:color/white" />
  29.  
  30. <Button
  31. android:id="@+id/btnUnRead"
  32. android:layout_width="120dp"
  33. android:layout_height="match_parent"
  34. android:background="#ecd50a"
  35. android:clickable="true"
  36. android:text="标记未读"
  37. android:textColor="@android:color/white" />
  38.  
  39. <Button
  40. android:id="@+id/btnDelete"
  41. android:layout_width="60dp"
  42. android:layout_height="match_parent"
  43. android:background="#d9dee4"
  44. android:text="删除"
  45. android:textColor="@android:color/white" />
  46.  
  47. </com.mcxtzhang.swipemenulib.SwipeMenuLayout>

3、Activity

  1. public class RecyclerSlideActivity extends AppCompatActivity {
  2. private RecyclerView recyclerView;
  3. private RecyclerSlideAdapter adapter;
  4. private List<String> mDatas;
  5. private LinearLayoutManager mLayoutManager;
  6.  
  7. @Override
  8. protected void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.activity_recycler_slide);
  11. initData();
  12. recyclerView = (RecyclerView) findViewById(R.id.recycler);
  13. adapter = new RecyclerSlideAdapter(this, mDatas);
  14. adapter.setOnDelListener(new RecyclerSlideAdapter.onSlideListener() {
  15.  
  16. @Override
  17. public void onDel(int position) {
  18. Toast.makeText(RecyclerSlideActivity.this, "删除:" + position, Toast.LENGTH_SHORT).show();
  19. mDatas.remove(position);
  20. adapter.notifyItemChanged(position);
  21. }
  22.  
  23. @Override
  24. public void onTop(int position) {
  25. String s = mDatas.get(position);
  26. mDatas.remove(s);
  27. adapter.notifyItemInserted(0);
  28. mDatas.add(0, s);
  29. adapter.notifyItemRemoved(position + 1);
  30. if (mLayoutManager.findFirstVisibleItemPosition() == 0) {
  31. recyclerView.scrollToPosition(0);
  32. }
  33. }
  34. });
  35. recyclerView.setAdapter(adapter);
  36. recyclerView.setLayoutManager(mLayoutManager = new LinearLayoutManager(this));
  37.  
  38. recyclerView.setOnTouchListener(new View.OnTouchListener() {
  39. @Override
  40. public boolean onTouch(View view, MotionEvent motionEvent) {
  41. if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
  42. SwipeMenuLayout viewCache = SwipeMenuLayout.getViewCache();
  43. if (null != viewCache) {
  44. viewCache.smoothClose();
  45. }
  46. }
  47. return false;
  48. }
  49. });
  50.  
  51. }
  52.  
  53. private void initData() {
  54. mDatas = new ArrayList<>();
  55. for (int i = 0; i < 40; i++) {
  56. mDatas.add("item" + i);
  57. }
  58. }
  59. }

4、adapter

  1. public class RecyclerSlideAdapter extends RecyclerView.Adapter<RecyclerSlideAdapter.Slide> {
  2. private Context context;
  3. private LayoutInflater mInflater;
  4. private List<String> mDatas;
  5.  
  6. public RecyclerSlideAdapter(Context context, List<String> mDatas) {
  7. this.context = context;
  8. this.mDatas = mDatas;
  9. mInflater = LayoutInflater.from(context);
  10. }
  11.  
  12. @Override
  13. public Slide onCreateViewHolder(ViewGroup parent, int viewType) {
  14.  
  15. return new Slide(mInflater.inflate(R.layout.item_recycler, parent, false));
  16. }
  17.  
  18. @Override
  19. public void onBindViewHolder(final Slide holder, final int position) {
  20. //这句话关掉IOS阻塞式交互效果,并依此打开左滑右滑
  21. // ((SwipeMenuLayout) holder.itemView).setIos(false).setLeftSwipe(position % 2 == 0 ? true : false);
  22.  
  23. // holder.content.setText(mDatas.get(position));
  24.  
  25. //验证长按
  26. holder.content.setOnLongClickListener(new View.OnLongClickListener() {
  27. @Override
  28. public boolean onLongClick(View view) {
  29. Toast.makeText(context, "longclig", Toast.LENGTH_SHORT).show();
  30. return false;
  31. }
  32. });
  33. holder.btnUnRead.setVisibility(position % 3 == 0 ? View.GONE : View.VISIBLE);
  34. holder.btnDelete.setOnClickListener(new View.OnClickListener() {
  35. @Override
  36. public void onClick(View view) {
  37. /**
  38. * 如果删除时,不适用adapter.notifyItemRemoved(position),则删除没有动画效果
  39. * 如果想让侧滑菜单同时关闭,需要同时调用(CstSwipeDelMenu)holder.itemView).quickClose();
  40. */
  41. mOnSlideListener.onDel(holder.getAdapterPosition());
  42. }
  43. });
  44. //注意事项,设置item点击,不能对真个holder.itemView设置,只能对第一个TextView设置
  45. holder.content.setOnClickListener(new View.OnClickListener() {
  46. @Override
  47. public void onClick(View view) {
  48. Toast.makeText(context, "onClick:" + position, Toast.LENGTH_SHORT).show();
  49. }
  50. });
  51. //置顶
  52. holder.btnTop.setOnClickListener(new View.OnClickListener() {
  53. @Override
  54. public void onClick(View view) {
  55. if (null != mOnSlideListener) {
  56. mOnSlideListener.onTop(holder.getAdapterPosition());
  57. }
  58. }
  59. });
  60.  
  61. }
  62.  
  63. @Override
  64. public int getItemCount() {
  65. return null != mDatas ? mDatas.size() : 0;
  66. }
  67.  
  68. /**
  69. * 和Activity通信的接口
  70. */
  71. public interface onSlideListener {
  72. void onDel(int position);
  73.  
  74. void onTop(int position);
  75. }
  76.  
  77. private onSlideListener mOnSlideListener;
  78.  
  79. public onSlideListener getmOnSlideListener() {
  80. return mOnSlideListener;
  81. }
  82.  
  83. public void setOnDelListener(onSlideListener mOnDelListener) {
  84. this.mOnSlideListener = mOnDelListener;
  85. }
  86.  
  87. public class Slide extends RecyclerView.ViewHolder {
  88. TextView content;
  89. Button btnDelete;
  90. Button btnUnRead;
  91. Button btnTop;
  92.  
  93. public Slide(View itemView) {
  94. super(itemView);
  95. content = (TextView) itemView.findViewById(R.id.content);
  96. btnDelete = (Button) itemView.findViewById(R.id.btnDelete);
  97. btnUnRead = (Button) itemView.findViewById(R.id.btnUnRead);
  98. btnTop = (Button) itemView.findViewById(R.id.btnTop);
  99. }
  100. }
  101. }

RecyclerView滑动Scroll

  1. package com.bumptech.glide.integration.recyclerview;
  2.  
  3. import android.support.v7.widget.LinearLayoutManager;
  4. import android.support.v7.widget.RecyclerView;
  5. import android.widget.AbsListView;
  6. import android.widget.ListView;
  7.  
  8. /**
  9. * Converts {@link android.support.v7.widget.RecyclerView.OnScrollListener} events to
  10. * {@link AbsListView} scroll events.
  11. *
  12. * <p>Requires that the the recycler view be using a {@link LinearLayoutManager} subclass.
  13. */
  14. public final class RecyclerToListViewScrollListener extends RecyclerView.OnScrollListener {
  15. public static final int UNKNOWN_SCROLL_STATE = Integer.MIN_VALUE;
  16. private final AbsListView.OnScrollListener scrollListener;
  17. private int lastFirstVisible = -1;
  18. private int lastVisibleCount = -1;
  19. private int lastItemCount = -1;
  20.  
  21. public RecyclerToListViewScrollListener(AbsListView.OnScrollListener scrollListener) {
  22. this.scrollListener = scrollListener;
  23. }
  24.  
  25. @Override
  26. public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
  27. int listViewState;
  28. switch (newState) {
  29. case RecyclerView.SCROLL_STATE_DRAGGING:
  30. listViewState = ListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL;
  31. break;
  32. case RecyclerView.SCROLL_STATE_IDLE:
  33. listViewState = ListView.OnScrollListener.SCROLL_STATE_IDLE;
  34. break;
  35. case RecyclerView.SCROLL_STATE_SETTLING:
  36. listViewState = ListView.OnScrollListener.SCROLL_STATE_FLING;
  37. break;
  38. default:
  39. listViewState = UNKNOWN_SCROLL_STATE;
  40. }
  41.  
  42. scrollListener.onScrollStateChanged(null /*view*/, listViewState);
  43. }
  44.  
  45. @Override
  46. public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
  47. LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
  48.  
  49. int firstVisible = layoutManager.findFirstVisibleItemPosition();
  50. int visibleCount = Math.abs(firstVisible - layoutManager.findLastVisibleItemPosition());
  51. int itemCount = recyclerView.getAdapter().getItemCount();
  52.  
  53. if (firstVisible != lastFirstVisible || visibleCount != lastVisibleCount
  54. || itemCount != lastItemCount) {
  55. scrollListener.onScroll(null, firstVisible, visibleCount, itemCount);
  56. lastFirstVisible = firstVisible;
  57. lastVisibleCount = visibleCount;
  58. lastItemCount = itemCount;
  59. }
  60. }
  61. }

RecyclerView实现侧滑删除、置顶、滑动的更多相关文章

  1. 006PHP文件处理—— 目录操作 删除目录 删除置顶类型文件

    <?php /** * 目录操作 删除目录 删除置顶类型文件 */ //echo rmdir('61') or die('目录删除失败'); //删除一个目录中有其他文件的内容的方法: //第1 ...

  2. Android实现RecyclerView侧滑删除和长按拖拽-ItemTouchHelper

    RecyclerView这个被誉为ListView和GirdView的替代品,它的用法在之前的一篇博文中就已经讲过了,今天我们就来实现RecyclerView的侧滑删除和长按拖拽功能,实现这两个功能我 ...

  3. Android的SwipeToDismiss第三方开源框架模拟QQ对话列表侧滑删除,置顶,将头像图片圆形化处理。

      <Android SwipeToDismiss:左右滑动删除ListView条目Item> Android的SwipeToDismiss是github上一个第三方开源框架(github ...

  4. QQ好友列表向左滑动出现置顶、删除--第三方开源--SwipeMenuListView

    SwipeMenuListView是在github上的第三方开源项目,该项目在github上的链接地址是:https://github.com/baoyongzhang/SwipeMenuListVi ...

  5. Android开发——使用高级的RecyclerView实现侧滑菜单删除功能(SwipeRecyclerView)

    使用之前,先简单介绍一下这个SwipeRecyclerView,这是严大(严振杰)基于RecyclerView的进行修改和封装的高级RecyclerView,其可以实现像QQ聊天界面的侧滑删除菜单,和 ...

  6. Ionic-wechat项目边开发边学(四):可伸缩输入框,下拉刷新, 置顶删除

    摘要 上一篇文章主要介绍了ion-list的使用, ion-popup的使用, 通过sass自定义样式, localStorage的使用, 自定义指令和服务. 这篇文章实现的功能有消息的置顶与删除, ...

  7. UITableView设置Cell左滑多个按钮(编辑,删除,置顶等)

    一.iOS7不支持cell多个按钮这个时候可以使用一个三方库JZTableViewRowAction,引用类扩展文件并实现其代理方法 JZTableViewRowAction下载地址:http://d ...

  8. 仿照 QQ 的 cell 的左滑删除、置顶、标记未读效果

    侧滑删除.置顶.取消关注,在iOS8之前需要我们自定义,iOS8时苹果公司推出了新的API,UITableViewRowAction类,我们可以使用该类方便的制作出如下图的效果. 下面是实现的主要代码 ...

  9. RecyclerView进阶:使用ItemTouchHelper实现拖拽和侧滑删除

    现在RecyclerView的应用越来越广泛了,不同的应用场景需要其作出不同的改变.有时候我们可能需要实现侧滑删除的功能,比如知乎首页的侧滑删除,又或者长按Item进行拖动与其他Item进行位置的交换 ...

随机推荐

  1. HydroD:辅助脚本函数

    HydroD:辅助函数 在HydroD中,使用JS脚本可以快速进行模拟参数设置,但是经过尝试,HydroD中的JS脚本语言并不支持现在JavaScript中的一些语法.所以考虑采用Matlab字符串拼 ...

  2. 庆祝dotnet6,fastgithub送给你

    前言 dotnet6正式发布了,fastgithub是使用dotnet开发的一款github加速器,作为开发者,无人不知github,作为github用户,fastgithub也许是你不可或缺的本机工 ...

  3. 高德地图API中折线polyline不能跨越180度经度线的解决方案

    1.问题 最近在使用高德地图的API,有一个需求是画出对象的历史轨迹,采用了高德地图API中的折线polyline函数.但如果需要跨180度经度线的折线,会出现不能跨越的情况,如下图所示: 图中有三个 ...

  4. Django笔记&教程 5-2 进阶查询——Queryset

    Django 自学笔记兼学习教程第5章第2节--进阶查询--Queryset 点击查看教程总目录 Queryset相关内容其实蛮多的,本文只介绍一些常用的,详细的推荐查询官方文档:queryset-a ...

  5. 大爽Python入门教程 2-3 字符串,列表,字典

    大爽Python入门公开课教案 点击查看教程总目录 除了通用的序列方法, 列表和字符串还有些自己的专属方法. 后面介绍有些是英中文对照介绍(英文来自官方文档), 便于大家更深入的去理解其意思. 灵活的 ...

  6. 大爽Python入门教程 0-4 安装Pycharm

    大爽Python入门公开课教案 点击查看教程总目录 安装重量级IDE--Pycharm 一 下载 下面步骤1,2中网络卡顿的朋友, 请直接前往步骤3来下载. 使用搜索引擎搜索Pycharm, 打开搜索 ...

  7. Django 小实例S1 简易学生选课管理系统 5 实现注册功能

    Django 小实例S1 简易学生选课管理系统 第5节--实现注册功能 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 本文涉及到的新的额外知识点: ...

  8. 菜鸡的Java笔记 - java 线程常用操作方法

    线程常用操作方法        线程的命名操作,线程的休眠,线程的优先级            线程的所有操作方法几乎都在 Thread 类中定义好了            线程的命名和取得      ...

  9. python读写文件with open

    简介 使用python的过程中肯定少不了读取文件的操作, 传统的形式是使用 直接打开.然后在操作.然后再关闭, 这样代码量稍微大些不说,一旦在操作步骤中出现报错,则无法进行文件的关闭: 案例一(读取) ...

  10. 拨开由问题《linux下malloc最大可申请的内存》带来的重重疑云

    今天阅读相关书籍的时候看到 "进程中堆的最大申请数量" 这一问题,我们知道使用malloc分配内存是在堆Heap里面分配的,如果一台机器一共有8GB物理内存,空闲5GB,那么我们使 ...