国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android RecyclerView滑動刪除和拖動排序

2019-12-12 06:03:01
字體:
來源:轉載
供稿:網友

本篇是接著上面三篇之后的一個對RecyclerView的介紹,這里多說兩句,如果你還在使用ListView的話,可以放棄掉ListView了。RecyclerView自動幫我們緩存Item視圖(ViewHolder),允許我們自定義各種動作的動畫和分割線,允許我們對Item進行一些手勢操作。另外,因為Design庫的推出大大方便我們編寫帶有Material風格的App,而ListView是不兼容這個庫的,比如滑動的相互協調,只有RecyclerView能做到。

先看本篇內容的效果圖:

 

效果內容主要有三部分:
 •長按點擊其中一個Item之后可以將其拖動到其他地方
 •向左右滑動可以刪除某個Item
 •長按的時候會有一個浮起的動作,放下之后會重新重新對齊

 ①先易后難,卡片浮起效果 
 在Material Design中,物件的呈現是以3d的模式來進行的,也就是在原來的基礎上增加了一個Z軸來表示物體的高度。 

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

 

實現:
 水波紋效果使用系統提供的,因為Demo中使用的是一個CardView來呈現內容,所以只需要給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的移動,改變列表的排序。要實現這兩個功能,需要用到一個類ItemTouchHelper,當我們構造好這個類之后,可以調用它的attachToRecyclerView方法將其綁定在某個RecyclerView中,當RecyclerView出現某些操作(滑動和移動)時,構造這個類的時候傳入的回調類會回調相應的方法,我們在這些方法中對數據集進行操作即可。
 new ItemTouchHelper(new ItemTouchHelper.Callback() {    //省略代碼
}).attachToRecyclerView(mRecyclerView); 

 接著就是重寫接口Callback的方法了,這里需要重寫的有幾個,分別是:
 •isItemViewSwipeEnable : Item是否可以滑動
 •isLongPressDragEnable :Item是否可以長按
 •getMovementFlags : 獲取移動標志
 •onMove : 當一個Item被另外的Item替代時回調,也就是數據集的內容順序改變
 •onMoved : 當onMove返回true的時候回調
 •onSwiped : 當某個Item被滑動離開屏幕之后回調
 •setSelectedChange : 某個Item被長按選中會被回調,當某個被長按移動的Item被釋放時也調用 

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被拖動和移動的時候回調,這里我們用來播放動畫,當viewHolder不為空時為選中狀態    否則為釋放狀態   */  @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) {    // 移動時更改列表中對應的位置并返回true    Collections.swap(newsList, viewHolder.getAdapterPosition(), target        .getAdapterPosition());    return true;  }  /*    當onMove返回true時調用   */  @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) {    // 將數據集中的數據移除    newsList.remove(viewHolder.getAdapterPosition());    // 刷新列表    mAdapter.notifyItemRemoved(viewHolder.getAdapterPosition());  }}).attachToRecyclerView(mRecyclerView);

這里直接貼出代碼,并做了注釋,應該比較簡單了。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 滨海县| 招远市| 兴文县| 汝南县| 天台县| 嘉义县| 达孜县| 临西县| 绥芬河市| 青神县| 靖西县| 武冈市| 南江县| 大连市| 灵寿县| 拜泉县| 阜城县| 壤塘县| 陵水| 瑞昌市| 奎屯市| 上杭县| 青神县| 太白县| 连云港市| 渝中区| 孟津县| 三原县| 连平县| 安龙县| 阜宁县| SHOW| 藁城市| 乐都县| 和田市| 东阿县| 墨竹工卡县| 古交市| 宝山区| 大石桥市| 高安市|