可滑動刪除的Listview:EnhancedListView

open_gly 8年前發布 | 8K 次閱讀 Android開發 移動開發

 android自帶的下拉通知幕簾和谷歌記事google keep的listview都有一個共同的效果,左右滑動可刪除listView,雖然實際使用中對這種效果的需求不是剛需,但能實現也是非常酷的。

github上有這種效果的開源代碼EnhancedListView,項目地址:https://github.com/timroes/EnhancedListView

使用方法跟一般的控件一下,在xml中使用<de.timroes.android.listview.EnhancedListView>來表明是EnhancedListView控件,然后加上應該有的屬性。

除了滑動刪除效果之外,該控件還有個撤銷功能,能撤銷上一步的滑動刪除操作。

1.滑動刪除

你需要調用enableSwipeToDismiss()來設置滑動刪除可用,默認左右均可滑動,setSwipeDirection()方法可以限制滑動的方向。默認,一次滑動真個listview的Item都會滑動,如果你想Item只是一部分跟著滑動,可以調用setSwipeLayout()方法,并且將需要滑動的View的id作為參數傳遞給他。

如果你只想滑動部分item,而不是每個item都能滑動,則可以在OnShouldSwipeCallback方法中指定,這種情況發生在當listview有headerview的時候,比如下面的代碼實現了只滑動偶數item:

 

mListView.setShouldSwipeCallback(new OnShouldSwipeCallback() {
  @Override
  public boolean onShouldSwipe(EnhancedListView lv, int position) {
    // Only allow even items to be swiped (for whatever reason)
    return position % 2 == 0;
  }
});

OnShouldSwipeCallback中onShouldSwipe()方法return true則表示該item可滑動,否則為不可滑動。

在默認情況下,當你滑動了至少32dip距離的時候,滑動效果才會開始,如果你想改變這個值,可以在app的dimen文件中增加elv_touch_slop來覆蓋默認的值。

2.撤銷

EnhancedListView提供了在滑動刪除之后還能撤銷這種行為的方法,需要創建一個EnhancedListView.OnDismissCallback回調對象,并且將其傳遞給EnhancedListView.setDismissCallback,如果你刪除item之前調用setDismissCallback,則會發生IllegalStateException異常。

// mAdapter if your adapter, that has already been initialized and set to the listview.
setDismissCallback(new OnDismissCallback() {
  @Override public EnhancedListView.Undoable onDismiss(EnhancedListView listView, final int position) {
    // Store the item for later undo
    final Person item = (Person) mAdapter.getItem(position);
    // Remove the item from the adapter
    mAdapter.remove(position);
    // return an Undoable
    return new EnhancedListView.Undoable() {
      // Reinsert the item to the adapter
      @Override public void undo() {
        mAdapter.insert(position, item);
      }
      // Return a string for your item
      @Override public String getTitle() {
        return "Deleted '" + item.getFullName() . "'"; // Plz, use the resource system :)
      }
      // Delete item completely from your persistent storage
      @Override public void discard() {
        MyDatabasUtils.delete(item);
      }
    };
  }
});

 

 本文由用戶 open_gly 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!