Android RecyclerView滑動(dòng)刪除和拖動(dòng)排序
本篇是接著上面三篇之后的一個(gè)對(duì)RecyclerView的介紹,這里多說兩句,如果你還在使用ListView的話,可以放棄掉ListView了。RecyclerView自動(dòng)幫我們緩存Item視圖(ViewHolder),允許我們自定義各種動(dòng)作的動(dòng)畫和分割線,允許我們對(duì)Item進(jìn)行一些手勢操作。另外,因?yàn)镈esign庫的推出大大方便我們編寫帶有Material風(fēng)格的App,而ListView是不兼容這個(gè)庫的,比如滑動(dòng)的相互協(xié)調(diào),只有RecyclerView能做到。
先看本篇內(nèi)容的效果圖:

效果內(nèi)容主要有三部分:
•長按點(diǎn)擊其中一個(gè)Item之后可以將其拖動(dòng)到其他地方
•向左右滑動(dòng)可以刪除某個(gè)Item
•長按的時(shí)候會(huì)有一個(gè)浮起的動(dòng)作,放下之后會(huì)重新重新對(duì)齊
①先易后難,卡片浮起效果
在Material Design中,物件的呈現(xiàn)是以3d的模式來進(jìn)行的,也就是在原來的基礎(chǔ)上增加了一個(gè)Z軸來表示物體的高度。

當(dāng)我們點(diǎn)擊一個(gè)卡片的時(shí)候,應(yīng)該給予用戶一些反饋,讓用戶知道自己在操作這個(gè)卡片,也就是觸摸反饋。觸摸效果圖的觸摸反饋是先出現(xiàn)水波紋,接著當(dāng)卡片可以移動(dòng)的時(shí)候先浮動(dòng),再開始移動(dòng),最后下落,效果如下:(浮起的動(dòng)畫可能要仔細(xì)看)

實(shí)現(xiàn):
水波紋效果使用系統(tǒng)提供的,因?yàn)镈emo中使用的是一個(gè)CardView來呈現(xiàn)內(nèi)容,所以只需要給CardView加上兩個(gè)屬性即可:
android:clickable="true"
android:foreground="?android:attr/selectableItemBackground"
浮起和下沉的動(dòng)畫也不難,改變View的translationZ屬性即可:
private void pickUpAnimation(View view) {
ObjectAnimator animator = ObjectAnimator.ofFloat(view, "translationZ", 1f, 10f);
animator.setInterpolator(new DecelerateInterpolator());
animator.setDuration(300);
animator.start();
}
②滑動(dòng)(Swipe)和移動(dòng)(Move)Item
Swipe是指我們上面的左右滑動(dòng)刪除,Move則是我們對(duì)Item的移動(dòng),改變列表的排序。要實(shí)現(xiàn)這兩個(gè)功能,需要用到一個(gè)類ItemTouchHelper,當(dāng)我們構(gòu)造好這個(gè)類之后,可以調(diào)用它的attachToRecyclerView方法將其綁定在某個(gè)RecyclerView中,當(dāng)RecyclerView出現(xiàn)某些操作(滑動(dòng)和移動(dòng))時(shí),構(gòu)造這個(gè)類的時(shí)候傳入的回調(diào)類會(huì)回調(diào)相應(yīng)的方法,我們?cè)谶@些方法中對(duì)數(shù)據(jù)集進(jìn)行操作即可。
new ItemTouchHelper(new ItemTouchHelper.Callback() { //省略代碼
}).attachToRecyclerView(mRecyclerView);
接著就是重寫接口Callback的方法了,這里需要重寫的有幾個(gè),分別是:
•isItemViewSwipeEnable : Item是否可以滑動(dòng)
•isLongPressDragEnable :Item是否可以長按
•getMovementFlags : 獲取移動(dòng)標(biāo)志
•onMove : 當(dāng)一個(gè)Item被另外的Item替代時(shí)回調(diào),也就是數(shù)據(jù)集的內(nèi)容順序改變
•onMoved : 當(dāng)onMove返回true的時(shí)候回調(diào)
•onSwiped : 當(dāng)某個(gè)Item被滑動(dòng)離開屏幕之后回調(diào)
•setSelectedChange : 某個(gè)Item被長按選中會(huì)被回調(diào),當(dāng)某個(gè)被長按移動(dòng)的Item被釋放時(shí)也調(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) {
// 拖拽的標(biāo)記,這里允許上下左右四個(gè)方向
int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT |
ItemTouchHelper.RIGHT;
// 滑動(dòng)的標(biāo)記,這里允許左右滑動(dòng)
int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
return makeMovementFlags(dragFlags, swipeFlags);
}
/*
這個(gè)方法會(huì)在某個(gè)Item被拖動(dòng)和移動(dòng)的時(shí)候回調(diào),這里我們用來播放動(dòng)畫,當(dāng)viewHolder不為空時(shí)為選中狀態(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) {
// 移動(dòng)時(shí)更改列表中對(duì)應(yīng)的位置并返回true
Collections.swap(newsList, viewHolder.getAdapterPosition(), target
.getAdapterPosition());
return true;
}
/*
當(dāng)onMove返回true時(shí)調(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);
// 移動(dòng)完成后刷新列表
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)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android RecyclerView item選中放大被遮擋問題詳解
- Android RecyclerView實(shí)現(xiàn)多種item布局的方法
- Android使用CardView作為RecyclerView的Item并實(shí)現(xiàn)拖拽和左滑刪除
- Android中RecyclerView實(shí)現(xiàn)Item添加和刪除的代碼示例
- Android中RecyclerView的item寬高問題詳解
- Android RecyclerView顯示Item布局不一致解決辦法
- Android RecyclerView的Item點(diǎn)擊事件實(shí)現(xiàn)整理
- Android 中RecyclerView多種item布局的寫法(頭布局+腳布局)
- Android RecyclerView自由拖動(dòng)item的實(shí)現(xiàn)代碼
相關(guān)文章
Android中 webView調(diào)用JS出錯(cuò)的解決辦法
這篇文章主要介紹了Android中 webView調(diào)用JS出錯(cuò)的解決辦法,需要的朋友可以參考下2015-01-01
Android ProgressDialog使用總結(jié)
ProgressDialog 繼承自AlertDialog,AlertDialog繼承自Dialog,實(shí)現(xiàn)DialogInterface接口,本文給大家介紹Android ProgressDialog使用總結(jié)的相關(guān)知識(shí),需要的朋友通過此文一起學(xué)習(xí)吧2016-01-01
Android中Serializable和Parcelable序列化對(duì)象詳解
這篇文章主要介紹了Android中Serializable和Parcelable序列化對(duì)象的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-02-02
Android開發(fā)獲取短信的內(nèi)容并截取短信
本文給大家介紹android開發(fā)獲取短信內(nèi)容并截取短息的相關(guān)內(nèi)容,本文代碼簡單易懂,感興趣的朋友一起學(xué)習(xí)吧2015-12-12
Android自定義控件之組合控件學(xué)習(xí)筆記分享
這篇文章主要為大家分享了Android自定義控件之組合控件學(xué)習(xí)筆記,具有一定的實(shí)用性和參考價(jià)值,感興趣的小伙伴們可以參考一下2016-05-05
Android應(yīng)用中實(shí)現(xiàn)跳轉(zhuǎn)外部瀏覽器打開鏈接功能
在開發(fā)Android應(yīng)用程序時(shí),有時(shí)候我們需要讓用戶跳轉(zhuǎn)到外部瀏覽器打開特定的鏈接,例如打開一個(gè)網(wǎng)頁、下載文件等,本文將介紹如何在Android應(yīng)用中實(shí)現(xiàn)跳轉(zhuǎn)外部瀏覽器打開鏈接的功能,感興趣的朋友一起看看吧2024-06-06
Android獲取arrays.xml里的數(shù)組字段值實(shí)例詳解
這篇文章主要介紹了Android獲取arrays.xml里的數(shù)組字段值實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04
Android 個(gè)人理財(cái)工具六:顯示賬單明細(xì) 下
本文主要節(jié)誒是Android 個(gè)人理財(cái)工具顯示賬單明細(xì),主要實(shí)現(xiàn)此窗口的查詢和刪除功能,這里提供實(shí)現(xiàn)代碼,有興趣的小伙伴可以參考下2016-08-08
Android不壓縮圖片實(shí)現(xiàn)高清加載巨圖實(shí)例
這篇文章主要為大家介紹了Android不壓縮圖片實(shí)現(xiàn)高清加載巨圖實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06

