Android源代码学习笔记:RecyclerViewSwipeDismiss

 

简略概述:

 1     <LinearLayout
 2         android:layout_width="match_parent"  3  android:layout_height="match_parent"  4  android:orientation="vertical">  5 <TextView  6 android:layout_width="match_parent"  7  android:layout_height="wrap_content"  8  android:text="horizontal swipe"/>  9 10 <android.support.v7.widget.RecyclerView 11 android:id="@+id/recyclerView" 12  android:layout_width="match_parent" 13  android:layout_height="200dp" 14  android:scrollbars="vertical" /> 15 16 <TextView 17 android:layout_width="match_parent" 18  android:layout_height="wrap_content" 19  android:text="vertical swipe"/> 20 21 <android.support.v7.widget.RecyclerView 22 android:id="@+id/recyclerHorizontalView" 23  android:layout_width="match_parent" 24  android:layout_height="200dp" 25  android:scrollbars="vertical" 26 /> 27 </LinearLayout>

RecyclerView是一个比ListView更灵活的一个控件。

使用LayoutManager来确定每一个item的排列方式。为增加和删除项目提供默认的动画效果。

Adapter:使用RecyclerView之前,你需要一个继承自RecyclerView.Adapter的适配器,作用是将数据与每一个item的界面进行绑定。

LayoutManager:用来确定每一个item如何进行排列摆放,何时展示和隐藏。回收或重用一个View的时候,LayoutManager会向适配器请求新的数据来替换旧的数据,这种机制避免了创建过多的View和频繁的调用findViewById方法(与ListView原理类似)。

目前SDK中提供了三种自带的LayoutManager:

  • LinearLayoutManager

  • GridLayoutManager

  • StaggeredGridLayoutManager

如何使用:

创建

onTouchListener,并创建自身的RecyclerView。

SwipeDismissRecyclerViewTouchListener listener = new SwipeDismissRecyclerViewTouchListener.Builder(
        recyclerView,
        new SwipeDismissRecyclerViewTouchListener.DismissCallbacks() {
            @Override
            public boolean canDismiss(int position) {
                return true;
            }

            @Override
            public void onDismiss(View view) {
                // Do what you want when dismiss

            }
        })
        .setIsVertical(false)
        .setItemTouchCallback(
                new SwipeDismissRecyclerViewTouchListener.OnItemTouchCallBack() {
                    @Override
                    public void onTouch(int index) {
                        // Do what you want when item be touched
                    }
                })
        .create();
recyclerView.setOnTouchListener(listener);


例如栗子中:

 public void onDismiss(View view) {
                        int id = recyclerView.getChildPosition(view);
                        adapter.mDataset.remove(id);
                        adapter.notifyDataSetChanged();

                        Toast.makeText(getBaseContext(), String.format("Delete item %d",id),Toast.LENGTH_LONG).show();
                    }


删除选中的item,更新database,并且用notifyDataSetChanged通知更新
setItemTouchCallback(
                        new SwipeDismissRecyclerViewTouchListener.OnItemTouchCallBack() {
                            @Override
                            public void onTouch(int index) {
                                showDialog(String.format("Click item %d", index));
                            }
                        })

//点击时显示,点击的item值

设置item移动动画

animator.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                --mDismissAnimationRefCount;
                if (mDismissAnimationRefCount == 0) {
                    // No active animations, process all pending dismisses.
                    // Sort by descending position
                    Collections.sort(mPendingDismisses);

                    int[] dismissPositions = new int[mPendingDismisses.size()];
                    for (int i = mPendingDismisses.size() - 1; i >= 0; i--) {
                        dismissPositions[i] = mPendingDismisses.get(i).position;
                    }
                    mCallbacks.onDismiss(dismissView);

                    // Reset mDownPosition to avoid MotionEvent.ACTION_UP trying to start a dismiss
                    // animation with a stale position
                    mDownPosition = ListView.INVALID_POSITION;

                    ViewGroup.LayoutParams lp;
                    for (PendingDismissData pendingDismiss : mPendingDismisses) {
                        // Reset view presentation
                        pendingDismiss.view.setAlpha(1f);
                        if (mIsVertical)
                            pendingDismiss.view.setTranslationY(0);
                        else
                            pendingDismiss.view.setTranslationX(0);
                        lp = pendingDismiss.view.getLayoutParams();
                        if (mIsVertical)
                            lp.width = originalHeight;
                        else
                            lp.height = originalHeight;

                        pendingDismiss.view.setLayoutParams(lp);
                    }

                    // Send a cancel event
                    long time = SystemClock.uptimeMillis();
                    MotionEvent cancelEvent = MotionEvent.obtain(time, time,
                            MotionEvent.ACTION_CANCEL, 0, 0, 0);
                    mRecyclerView.dispatchTouchEvent(cancelEvent);

                    mPendingDismisses.clear();
                }
            }
        });

        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                if (mIsVertical)
                    lp.width = (Integer) valueAnimator.getAnimatedValue();
                else
                    lp.height = (Integer) valueAnimator.getAnimatedValue();
                dismissView.setLayoutParams(lp);
            }
        });

        mPendingDismisses.add(new PendingDismissData(dismissPosition, dismissView));
        animator.start();
    }

 

转载于:https://www.cnblogs.com/wakerLight/p/5222505.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值