您的位置:首页 > 移动开发 > Android开发

recyclerview的使用,左滑删除

2015-08-07 12:41 531 查看
使用

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,请多多指教。


9bc9
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android swipe