首页 > 移动平台 > 详细

Android源代码学习笔记:RecyclerViewSwipeDismiss

时间:2016-02-27 12:14:56      阅读:216      评论:0      收藏:0      [点我收藏+]

 

技术分享

简略概述:

 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();
    }

 

Android源代码学习笔记:RecyclerViewSwipeDismiss

原文:http://www.cnblogs.com/wakerLight/p/5222505.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!