Android RecyclerView滑動刪除和拖動排序
本篇是接著上面三篇之后的一個對RecyclerView的介紹,這里多說兩句,如果你還在使用ListView的話,可以放棄掉ListView了。RecyclerView自動幫我們緩存Item視圖(ViewHolder),允許我們自定義各種動作的動畫和分割線,允許我們對Item進行一些手勢操作。另外,因為Design庫的推出大大方便我們編寫帶有Material風(fēng)格的App,而ListView是不兼容這個庫的,比如滑動的相互協(xié)調(diào),只有RecyclerView能做到。
先看本篇內(nèi)容的效果圖:
效果內(nèi)容主要有三部分:
•長按點擊其中一個Item之后可以將其拖動到其他地方
•向左右滑動可以刪除某個Item
•長按的時候會有一個浮起的動作,放下之后會重新重新對齊
①先易后難,卡片浮起效果
在Material Design中,物件的呈現(xiàn)是以3d的模式來進行的,也就是在原來的基礎(chǔ)上增加了一個Z軸來表示物體的高度。
當我們點擊一個卡片的時候,應(yīng)該給予用戶一些反饋,讓用戶知道自己在操作這個卡片,也就是觸摸反饋。觸摸效果圖的觸摸反饋是先出現(xiàn)水波紋,接著當卡片可以移動的時候先浮動,再開始移動,最后下落,效果如下:(浮起的動畫可能要仔細看)
實現(xiàn):
水波紋效果使用系統(tǒng)提供的,因為Demo中使用的是一個CardView來呈現(xiàn)內(nèi)容,所以只需要給CardView加上兩個屬性即可:
android:clickable="true"
android:foreground="?android:attr/selectableItemBackground"
浮起和下沉的動畫也不難,改變View的translationZ屬性即可:
private void pickUpAnimation(View view) { ObjectAnimator animator = ObjectAnimator.ofFloat(view, "translationZ", 1f, 10f); animator.setInterpolator(new DecelerateInterpolator()); animator.setDuration(300); animator.start(); }
②滑動(Swipe)和移動(Move)Item
Swipe是指我們上面的左右滑動刪除,Move則是我們對Item的移動,改變列表的排序。要實現(xiàn)這兩個功能,需要用到一個類ItemTouchHelper,當我們構(gòu)造好這個類之后,可以調(diào)用它的attachToRecyclerView方法將其綁定在某個RecyclerView中,當RecyclerView出現(xiàn)某些操作(滑動和移動)時,構(gòu)造這個類的時候傳入的回調(diào)類會回調(diào)相應(yīng)的方法,我們在這些方法中對數(shù)據(jù)集進行操作即可。
new ItemTouchHelper(new ItemTouchHelper.Callback() { //省略代碼
}).attachToRecyclerView(mRecyclerView);
接著就是重寫接口Callback的方法了,這里需要重寫的有幾個,分別是:
•isItemViewSwipeEnable : Item是否可以滑動
•isLongPressDragEnable :Item是否可以長按
•getMovementFlags : 獲取移動標志
•onMove : 當一個Item被另外的Item替代時回調(diào),也就是數(shù)據(jù)集的內(nèi)容順序改變
•onMoved : 當onMove返回true的時候回調(diào)
•onSwiped : 當某個Item被滑動離開屏幕之后回調(diào)
•setSelectedChange : 某個Item被長按選中會被回調(diào),當某個被長按移動的Item被釋放時也調(diào)用
new ItemTouchHelper(new ItemTouchHelper.Callback() { private RecyclerView.ViewHolder vh; @Override public boolean isItemViewSwipeEnabled() { return true; } @Override public boolean isLongPressDragEnabled() { return true; } @Override public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { // 拖拽的標記,這里允許上下左右四個方向 int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; // 滑動的標記,這里允許左右滑動 int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END; return makeMovementFlags(dragFlags, swipeFlags); } /* 這個方法會在某個Item被拖動和移動的時候回調(diào),這里我們用來播放動畫,當viewHolder不為空時為選中狀態(tài) 否則為釋放狀態(tài) */ @Override public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { super.onSelectedChanged(viewHolder, actionState); if (viewHolder != null) { vh = viewHolder; pickUpAnimation(viewHolder.itemView); } else { if (vh != null) { putDownAnimation(vh.itemView); } } } @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { // 移動時更改列表中對應(yīng)的位置并返回true Collections.swap(newsList, viewHolder.getAdapterPosition(), target .getAdapterPosition()); return true; } /* 當onMove返回true時調(diào)用 */ @Override public void onMoved(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, int fromPos, RecyclerView.ViewHolder target, int toPos, int x, int y) { super.onMoved(recyclerView, viewHolder, fromPos, target, toPos, x, y); // 移動完成后刷新列表 mAdapter.notifyItemMoved(viewHolder.getAdapterPosition(), target .getAdapterPosition()); } @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { // 將數(shù)據(jù)集中的數(shù)據(jù)移除 newsList.remove(viewHolder.getAdapterPosition()); // 刷新列表 mAdapter.notifyItemRemoved(viewHolder.getAdapterPosition()); } }).attachToRecyclerView(mRecyclerView);
這里直接貼出代碼,并做了注釋,應(yīng)該比較簡單了。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android RecyclerView item選中放大被遮擋問題詳解
- Android RecyclerView實現(xiàn)多種item布局的方法
- Android使用CardView作為RecyclerView的Item并實現(xiàn)拖拽和左滑刪除
- Android中RecyclerView實現(xiàn)Item添加和刪除的代碼示例
- Android中RecyclerView的item寬高問題詳解
- Android RecyclerView顯示Item布局不一致解決辦法
- Android RecyclerView的Item點擊事件實現(xiàn)整理
- Android 中RecyclerView多種item布局的寫法(頭布局+腳布局)
- Android RecyclerView自由拖動item的實現(xiàn)代碼
相關(guān)文章
Android 邊播邊緩存的實現(xiàn)(MP4 未加密m3u8)
這篇文章主要介紹了Android 邊播邊緩存的實現(xiàn)(MP4 未加密m3u8),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Android中使用GridView和ImageViewSwitcher實現(xiàn)電子相冊簡單功能實例
本篇文章主要介紹了Android中使用GridView和ImageViewSwitcher實現(xiàn)電子相冊簡單功能實例,具有一定的參考價值,有需要的可以了解一下。2016-12-12