使用
superrecyclerview进行左滑删除,设为默认地址等操作。
先看效果图
首先,导入此包
compile 'com.malinskiy:superrecyclerview:1.1.0'
这个包封装了recyclerview的一些常用方法,很好用,
它的特性:
1、当adapter没有设置的时候使用ProgressBar(进度条);
2、当adapter时空的时候使用EmptyView;
3、SwipeRefreshLayout (Google's one);
4、Swipe To Dismiss;
5、Sticky headers;
6、无限滚动,当到达最后一项时,加载更多数据;
其他的使用可以下载源码查看,项目中需要一个滑动删除效果,以前用的是SlideView自定义view,最近看recyclerview有滑动删除,就想直接用它了。直接上代码吧。
首先,在布局文件中加入这个代码,相当于以前的listview,圈出来的是个很好用的东西,当数据为空的时候显示这个布局,不用跟以前一样没数据隐藏这个显示那个。
然后看adapter,跟以前的adapter写法不一样,如果不明白,先去看下recyclerview的基本使用,
@Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { final Context context = parent.getContext(); View view = LayoutInflater.from(context).inflate(R.layout.item_addresses_recycle, parent, false); final ViewHolder viewHolder = new ViewHolder(view); SwipeLayout swipeLayout = viewHolder.swipeLayout; swipeLayout.setDragEdge(SwipeLayout.DragEdge.Right); swipeLayout.setShowMode(SwipeLayout.ShowMode.PullOut);
adapter的布局文件
<?xml version="1.0" encoding="utf-8" ?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:custom="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:background="@color/white" android:layout_width="match_parent" android:layout_height="match_parent"> <com.malinskiy.superrecyclerview.swipe.SwipeLayout android:id="@id/recyclerview_swipe" xmlns:swipe="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="wrap_content" android:layout_height="match_parent" android:background="#FF5534" android:tag="Bottom3" android:weightSum="8">
因为是即将上线的项目,代码不宜全拷出来,见谅。
SwipeLayout里面套两个linearlayout,一个表示不滑动时候应该显示的布局,一个是显示滑动后显示的布局。
这样基本实现了滑动,但是滑动的点击事情跟不滑动的点击事件有一点冲突。这个才是最耗时间的,下面是本人的解决办法。
public class RecyclerUtils { public static class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener { private OnItemClickListener mListener; public interface OnItemClickListener { public void onItemClick(View view, int position); } GestureDetector mGestureDetector; public RecyclerItemClickListener(Context context, OnItemClickListener listener) { mListener = listener; mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { @Override public boolean onSingleTapUp(MotionEvent e) { return true; } }); } @Override public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) { View childView = view.findChildViewUnder(e.getX(), e.getY()); if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) { mListener.onItemClick(childView, view.getChildPosition(childView)); } return false; } @Override public void onTouchEvent(RecyclerView view, MotionEvent e) { View childView = view.findChildViewUnder(e.getX(), e.getY()); if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) { mListener.onItemClick(childView, view.getChildPosition(childView)); } } } }先写了一个类,其实也是网上找的 ,自己改了点东西。然后发现不管滑出来没有,点击事件都会发生,这就导致滑出来后的删除按钮,点了之后也会执行,这不是我想要的效果mRecyclerView.addOnItemTouchListener(new RecyclerUtils.RecyclerItemClickListener(this, new RecyclerUtils.RecyclerItemClickListener.OnItemClickListener() { @Override public void onItemClick(View view, int position) { List<Address> addressList = adapter.getAddressList(); if (addressList != null && !addressList.get(position).notClick) { Intent intent = new Intent(mContext, AddressDetailActivity.class); intent.putExtra(Extra.ADDRESS, adapter.getAddress(position)); startActivityForResult(intent, 0); } } }));这是点击事件,于是我在Address里面加了个notClick字段,来判定是否能点击,如果滑出来了,这个字段就为true,在adpter里面加了vh.recyclerviewSwipe.addSwipeListener(new SwipeLayout.SwipeListener() { @Override public void onStartOpen(SwipeLayout swipeLayout) { item.notClick = true; } @Override public void onOpen(SwipeLayout swipeLayout) { item.notClick = true; } @Override public void onStartClose(SwipeLayout swipeLayout) { item.notClick = false; } @Override public void onClose(SwipeLayout swipeLayout) { item.notClick = false; } @Override public void onUpdate(SwipeLayout swipeLayout, int i, int i1) { } @Override public void onHandRelease(SwipeLayout swipeLayout, float v, float v1) { } });然后问题就解决了,中途还是了别的解决办法,但是效果都没有那么好。第一次写blog,请多多指教。