可滑動刪除的Listview:EnhancedListView
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); } }; } });