From 322702471f6f5c389f86afc63cbc2e963c4bf5f5 Mon Sep 17 00:00:00 2001 From: Aurelien Hubert Date: Thu, 9 May 2019 10:46:20 +0200 Subject: [PATCH] Fix bug during deletion --- .../android/ui/fragment/DataListFragment.kt | 53 +++++++++---------- 1 file changed, 25 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt index d9fea442..71c47e4a 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt @@ -46,7 +46,7 @@ class DataListFragment : RealmFragment(), LiveRowRepresentableDataSource, RowRep private var deletedItem: RealmObject? = null private var lastDeletedItemPosition: Int = 0 - private var lastItemClickedPosition: Int = 0 + private var lastItemClickedId: String = "" override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { super.onCreateView(inflater, container, savedInstanceState) @@ -61,11 +61,12 @@ class DataListFragment : RealmFragment(), LiveRowRepresentableDataSource, RowRep override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == REQUEST_CODE_DETAILS && resultCode == Activity.RESULT_OK) { - val needToDeleteItem = data?.getBooleanExtra(DataListActivity.IntentKey.ITEM_DELETED.keyName, false) ?: false + val needToDeleteItem = + data?.getBooleanExtra(DataListActivity.IntentKey.ITEM_DELETED.keyName, false) ?: false if (needToDeleteItem) { GlobalScope.launch(Dispatchers.Main) { delay(300) - deleteItem(lastItemClickedPosition) + deleteItem(lastItemClickedId) } } } @@ -95,20 +96,15 @@ class DataListFragment : RealmFragment(), LiveRowRepresentableDataSource, RowRep override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { this.dataType?.let { - if (it == LiveData.FILTER) { - val intent = Intent() - intent.putExtra(FiltersActivity.IntentKey.FILTER_ID.keyName, (row as Filter).id) - activity?.setResult(Activity.RESULT_OK, intent) - activity?.finish() - } else { - lastItemClickedPosition = position - EditableDataActivity.newInstanceForResult( - this, - it.ordinal, - (row as Identifiable).id, - REQUEST_CODE_DETAILS - ) - } + if (it == LiveData.FILTER) { + val intent = Intent() + intent.putExtra(FiltersActivity.IntentKey.FILTER_ID.keyName, (row as Filter).id) + activity?.setResult(Activity.RESULT_OK, intent) + activity?.finish() + } else { + lastItemClickedId = (row as Identifiable).id + EditableDataActivity.newInstanceForResult(this, it.ordinal, lastItemClickedId, REQUEST_CODE_DETAILS) + } } } @@ -130,7 +126,7 @@ class DataListFragment : RealmFragment(), LiveRowRepresentableDataSource, RowRep dataListAdapter = RowRepresentableAdapter(this, this) val swipeToDelete = SwipeToDeleteCallback(dataListAdapter) { position -> - deleteItem(position) + deleteItem((this.items[position] as Identifiable).id) } val itemTouchHelper = ItemTouchHelper(swipeToDelete) @@ -156,30 +152,31 @@ class DataListFragment : RealmFragment(), LiveRowRepresentableDataSource, RowRep /** * Delete item */ - private fun deleteItem(position: Int) { + private fun deleteItem(itemId: String) { if (isDetached || activity == null) { return } // Save the delete position & create a copy of the object - val mRecentlyDeletedItem = rowRepresentableForPosition(position) - lastDeletedItemPosition = position + val itemPosition = this.items.indexOfFirst { (it as Identifiable).id == itemId } + val itemToDelete = this.items.find { (it as Identifiable).id == itemId } - if (mRecentlyDeletedItem is RealmObject) { + if (itemToDelete is RealmObject && itemPosition != -1) { // Check if the object is valid for the deletion - if ((mRecentlyDeletedItem as Deletable).isValidForDelete(this.getRealm())) { - deletedItem = getRealm().copyFromRealm(mRecentlyDeletedItem) + if ((itemToDelete as Deletable).isValidForDelete(this.getRealm())) { + deletedItem = getRealm().copyFromRealm(itemToDelete) + lastDeletedItemPosition = itemPosition getRealm().executeTransaction { - mRecentlyDeletedItem.deleteFromRealm() + itemToDelete.deleteFromRealm() } - dataListAdapter.notifyItemRemoved(position) + dataListAdapter.notifyItemRemoved(itemPosition) showUndoSnackBar() } else { - dataListAdapter.notifyItemChanged(position) + dataListAdapter.notifyItemChanged(itemPosition) val builder = AlertDialog.Builder(requireContext()) - .setMessage((mRecentlyDeletedItem as Deletable).getFailedDeleteMessage()) + .setMessage((itemToDelete as Deletable).getFailedDeleteMessage()) .setNegativeButton(R.string.ok, null) builder.show() }