简略概述:
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(); }