recyclerview的使用,左滑删除

使用

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




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值