RecyclerView实现侧滑删除、置顶、滑动
1、首先在build.gradle里添加
compile 'com.github.mcxtzhang:SwipeDelMenuLayout:V1.2.1'
2、设置recyclerView的item布局
<?xml version="1.0" encoding="utf-8"?>
<com.mcxtzhang.swipemenulib.SwipeMenuLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="100dp"
android:clickable="true"
android:paddingBottom="1dp"
app:ios="false"
app:leftSwipe="true"
app:swipeEnable="true"> <TextView
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?android:attr/selectableItemBackground"
android:gravity="center"
android:text="项目中我是任意复杂的原Item布局" /> <!-- 以下都是侧滑菜单的内容依序排列 -->
<Button
android:id="@+id/btnTop"
android:layout_width="60dp"
android:layout_height="match_parent"
android:background="#d9dee4"
android:text="置顶"
android:textColor="@android:color/white" /> <Button
android:id="@+id/btnUnRead"
android:layout_width="120dp"
android:layout_height="match_parent"
android:background="#ecd50a"
android:clickable="true"
android:text="标记未读"
android:textColor="@android:color/white" /> <Button
android:id="@+id/btnDelete"
android:layout_width="60dp"
android:layout_height="match_parent"
android:background="#d9dee4"
android:text="删除"
android:textColor="@android:color/white" /> </com.mcxtzhang.swipemenulib.SwipeMenuLayout>
3、Activity
public class RecyclerSlideActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private RecyclerSlideAdapter adapter;
private List<String> mDatas;
private LinearLayoutManager mLayoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycler_slide);
initData();
recyclerView = (RecyclerView) findViewById(R.id.recycler);
adapter = new RecyclerSlideAdapter(this, mDatas);
adapter.setOnDelListener(new RecyclerSlideAdapter.onSlideListener() {
@Override
public void onDel(int position) {
Toast.makeText(RecyclerSlideActivity.this, "删除:" + position, Toast.LENGTH_SHORT).show();
mDatas.remove(position);
adapter.notifyItemChanged(position);
}
@Override
public void onTop(int position) {
String s = mDatas.get(position);
mDatas.remove(s);
adapter.notifyItemInserted(0);
mDatas.add(0, s);
adapter.notifyItemRemoved(position + 1);
if (mLayoutManager.findFirstVisibleItemPosition() == 0) {
recyclerView.scrollToPosition(0);
}
}
});
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(mLayoutManager = new LinearLayoutManager(this));
recyclerView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
SwipeMenuLayout viewCache = SwipeMenuLayout.getViewCache();
if (null != viewCache) {
viewCache.smoothClose();
}
}
return false;
}
});
}
private void initData() {
mDatas = new ArrayList<>();
for (int i = 0; i < 40; i++) {
mDatas.add("item" + i);
}
}
}
4、adapter
public class RecyclerSlideAdapter extends RecyclerView.Adapter<RecyclerSlideAdapter.Slide> {
private Context context;
private LayoutInflater mInflater;
private List<String> mDatas;
public RecyclerSlideAdapter(Context context, List<String> mDatas) {
this.context = context;
this.mDatas = mDatas;
mInflater = LayoutInflater.from(context);
}
@Override
public Slide onCreateViewHolder(ViewGroup parent, int viewType) {
return new Slide(mInflater.inflate(R.layout.item_recycler, parent, false));
}
@Override
public void onBindViewHolder(final Slide holder, final int position) {
//这句话关掉IOS阻塞式交互效果,并依此打开左滑右滑
// ((SwipeMenuLayout) holder.itemView).setIos(false).setLeftSwipe(position % 2 == 0 ? true : false);
// holder.content.setText(mDatas.get(position));
//验证长按
holder.content.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
Toast.makeText(context, "longclig", Toast.LENGTH_SHORT).show();
return false;
}
});
holder.btnUnRead.setVisibility(position % 3 == 0 ? View.GONE : View.VISIBLE);
holder.btnDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
/**
* 如果删除时,不适用adapter.notifyItemRemoved(position),则删除没有动画效果
* 如果想让侧滑菜单同时关闭,需要同时调用(CstSwipeDelMenu)holder.itemView).quickClose();
*/
mOnSlideListener.onDel(holder.getAdapterPosition());
}
});
//注意事项,设置item点击,不能对真个holder.itemView设置,只能对第一个TextView设置
holder.content.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(context, "onClick:" + position, Toast.LENGTH_SHORT).show();
}
});
//置顶
holder.btnTop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (null != mOnSlideListener) {
mOnSlideListener.onTop(holder.getAdapterPosition());
}
}
});
}
@Override
public int getItemCount() {
return null != mDatas ? mDatas.size() : 0;
}
/**
* 和Activity通信的接口
*/
public interface onSlideListener {
void onDel(int position);
void onTop(int position);
}
private onSlideListener mOnSlideListener;
public onSlideListener getmOnSlideListener() {
return mOnSlideListener;
}
public void setOnDelListener(onSlideListener mOnDelListener) {
this.mOnSlideListener = mOnDelListener;
}
public class Slide extends RecyclerView.ViewHolder {
TextView content;
Button btnDelete;
Button btnUnRead;
Button btnTop;
public Slide(View itemView) {
super(itemView);
content = (TextView) itemView.findViewById(R.id.content);
btnDelete = (Button) itemView.findViewById(R.id.btnDelete);
btnUnRead = (Button) itemView.findViewById(R.id.btnUnRead);
btnTop = (Button) itemView.findViewById(R.id.btnTop);
}
}
}
RecyclerView滑动Scroll
package com.bumptech.glide.integration.recyclerview; import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.AbsListView;
import android.widget.ListView; /**
* Converts {@link android.support.v7.widget.RecyclerView.OnScrollListener} events to
* {@link AbsListView} scroll events.
*
* <p>Requires that the the recycler view be using a {@link LinearLayoutManager} subclass.
*/
public final class RecyclerToListViewScrollListener extends RecyclerView.OnScrollListener {
public static final int UNKNOWN_SCROLL_STATE = Integer.MIN_VALUE;
private final AbsListView.OnScrollListener scrollListener;
private int lastFirstVisible = -1;
private int lastVisibleCount = -1;
private int lastItemCount = -1; public RecyclerToListViewScrollListener(AbsListView.OnScrollListener scrollListener) {
this.scrollListener = scrollListener;
} @Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
int listViewState;
switch (newState) {
case RecyclerView.SCROLL_STATE_DRAGGING:
listViewState = ListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL;
break;
case RecyclerView.SCROLL_STATE_IDLE:
listViewState = ListView.OnScrollListener.SCROLL_STATE_IDLE;
break;
case RecyclerView.SCROLL_STATE_SETTLING:
listViewState = ListView.OnScrollListener.SCROLL_STATE_FLING;
break;
default:
listViewState = UNKNOWN_SCROLL_STATE;
} scrollListener.onScrollStateChanged(null /*view*/, listViewState);
} @Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager(); int firstVisible = layoutManager.findFirstVisibleItemPosition();
int visibleCount = Math.abs(firstVisible - layoutManager.findLastVisibleItemPosition());
int itemCount = recyclerView.getAdapter().getItemCount(); if (firstVisible != lastFirstVisible || visibleCount != lastVisibleCount
|| itemCount != lastItemCount) {
scrollListener.onScroll(null, firstVisible, visibleCount, itemCount);
lastFirstVisible = firstVisible;
lastVisibleCount = visibleCount;
lastItemCount = itemCount;
}
}
}
RecyclerView实现侧滑删除、置顶、滑动的更多相关文章
- 006PHP文件处理—— 目录操作 删除目录 删除置顶类型文件
<?php /** * 目录操作 删除目录 删除置顶类型文件 */ //echo rmdir('61') or die('目录删除失败'); //删除一个目录中有其他文件的内容的方法: //第1 ...
- Android实现RecyclerView侧滑删除和长按拖拽-ItemTouchHelper
RecyclerView这个被誉为ListView和GirdView的替代品,它的用法在之前的一篇博文中就已经讲过了,今天我们就来实现RecyclerView的侧滑删除和长按拖拽功能,实现这两个功能我 ...
- Android的SwipeToDismiss第三方开源框架模拟QQ对话列表侧滑删除,置顶,将头像图片圆形化处理。
<Android SwipeToDismiss:左右滑动删除ListView条目Item> Android的SwipeToDismiss是github上一个第三方开源框架(github ...
- QQ好友列表向左滑动出现置顶、删除--第三方开源--SwipeMenuListView
SwipeMenuListView是在github上的第三方开源项目,该项目在github上的链接地址是:https://github.com/baoyongzhang/SwipeMenuListVi ...
- Android开发——使用高级的RecyclerView实现侧滑菜单删除功能(SwipeRecyclerView)
使用之前,先简单介绍一下这个SwipeRecyclerView,这是严大(严振杰)基于RecyclerView的进行修改和封装的高级RecyclerView,其可以实现像QQ聊天界面的侧滑删除菜单,和 ...
- Ionic-wechat项目边开发边学(四):可伸缩输入框,下拉刷新, 置顶删除
摘要 上一篇文章主要介绍了ion-list的使用, ion-popup的使用, 通过sass自定义样式, localStorage的使用, 自定义指令和服务. 这篇文章实现的功能有消息的置顶与删除, ...
- UITableView设置Cell左滑多个按钮(编辑,删除,置顶等)
一.iOS7不支持cell多个按钮这个时候可以使用一个三方库JZTableViewRowAction,引用类扩展文件并实现其代理方法 JZTableViewRowAction下载地址:http://d ...
- 仿照 QQ 的 cell 的左滑删除、置顶、标记未读效果
侧滑删除.置顶.取消关注,在iOS8之前需要我们自定义,iOS8时苹果公司推出了新的API,UITableViewRowAction类,我们可以使用该类方便的制作出如下图的效果. 下面是实现的主要代码 ...
- RecyclerView进阶:使用ItemTouchHelper实现拖拽和侧滑删除
现在RecyclerView的应用越来越广泛了,不同的应用场景需要其作出不同的改变.有时候我们可能需要实现侧滑删除的功能,比如知乎首页的侧滑删除,又或者长按Item进行拖动与其他Item进行位置的交换 ...
随机推荐
- jmeter 插件安装之阶梯式压测(五)
一.Jmeter插件安装 jmeter-plugins-manager-1.4.jar 下载地址:https://jmeter-plugins.org/install/Install/ 下载之后将插件 ...
- 攻防世界 WEB 高手进阶区 XCTF Web_php_unserialize Writeup
攻防世界 WEB 高手进阶区 XCTF Web_php_unserialize Writeup 题目介绍 题名考点 PHP反序列化漏洞 正则匹配 Writeup <?php class Demo ...
- 《手把手教你》系列技巧篇(四十一)-java+ selenium自动化测试 - 处理iframe -上篇(详解教程)
1.简介 原估计宏哥这里就不对iframe这个知识点做介绍和讲解了,因为前边的窗口切换就为这种网页处理提供了思路,另一个原因就是虽然iframe很强大,但是现在很少有网站用它了.但是还是有小伙伴或者童 ...
- MnogoDB唯一索引,稀疏索引
1,单个字段唯一索引 db.collection.createIndex({name:1},{unique:true} 2,多个字段联合索引示例 db.collection.createIndex({ ...
- GIS应用|快速开发REST空间分析服务
随着计算机的快速发展,GIS已经在各大领域得到应用,和我们的生活息息相关, 但是基于GIS几大厂商搭建服务,都会有一定的门槛,尤其是需要server,成本高,难度大,这里介绍一种在线GIS云平台,帮你 ...
- [atARC078F]Mole and Abandoned Mine
注意到最终图的样子可以看作一条从1到$n$的路径,以及删去这条路径上的边后,路径上的每一个点所对应的一个连通块 考虑dp,令$f_{S,i}$表示当前1到$n$路径上的最后一个点以及之前点(包括$i$ ...
- 深度学习,机器学习神器,白嫖免费GPU
深度学习,机器学习神器,白嫖免费GPU! 最近在学习计算机视觉,自己的小本本没有那么高的算力,层级尝试过Google的Colab,以及移动云的GPU算力,都不算理想.如果数据集比较小,可以试试Cola ...
- k8s-Pod污点与容忍
目录 Pod污点与容忍 大白话先解释一下污点与容忍 为什么要用污点和容忍? 官方解释 Taints参数 标记污点 容忍污点 取消所有节点污点 Pod污点与容忍 大白话先解释一下污点与容忍 污点:被打上 ...
- UI自动化测试:App的WebView页面中,当搜索栏无搜索按钮时处理方法
一.遇到的问题 在做移动端的UI自动化测试时,经常会遇到上图所示的搜索框,这里有个麻烦就是搜索框没有"搜索"按钮,UI自动化测试时不能确认搜索. 要解决这个问题,我们可以通过 dr ...
- 洛谷 P5233 - [JSOI2012]爱之项链(Polya 定理+递推)
洛谷题面传送门 首先很明显题目暗示我们先求出符合条件的戒指数量,再计算出由这些戒指能够构成的项链的个数,因此考虑分别计算它们.首先是计算符合条件的戒指数量,题目中"可以通过旋转重合的戒指视作 ...