Fix bug during deletion

dev
Aurelien Hubert 7 years ago
parent 8235c8e73a
commit 322702471f
  1. 53
      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 deletedItem: RealmObject? = null
private var lastDeletedItemPosition: Int = 0 private var lastDeletedItemPosition: Int = 0
private var lastItemClickedPosition: Int = 0 private var lastItemClickedId: String = ""
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
super.onCreateView(inflater, container, savedInstanceState) super.onCreateView(inflater, container, savedInstanceState)
@ -61,11 +61,12 @@ class DataListFragment : RealmFragment(), LiveRowRepresentableDataSource, RowRep
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data) super.onActivityResult(requestCode, resultCode, data)
if (requestCode == REQUEST_CODE_DETAILS && resultCode == Activity.RESULT_OK) { 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) { if (needToDeleteItem) {
GlobalScope.launch(Dispatchers.Main) { GlobalScope.launch(Dispatchers.Main) {
delay(300) delay(300)
deleteItem(lastItemClickedPosition) deleteItem(lastItemClickedId)
} }
} }
} }
@ -95,20 +96,15 @@ class DataListFragment : RealmFragment(), LiveRowRepresentableDataSource, RowRep
override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) { override fun onRowSelected(position: Int, row: RowRepresentable, fromAction: Boolean) {
this.dataType?.let { this.dataType?.let {
if (it == LiveData.FILTER) { if (it == LiveData.FILTER) {
val intent = Intent() val intent = Intent()
intent.putExtra(FiltersActivity.IntentKey.FILTER_ID.keyName, (row as Filter).id) intent.putExtra(FiltersActivity.IntentKey.FILTER_ID.keyName, (row as Filter).id)
activity?.setResult(Activity.RESULT_OK, intent) activity?.setResult(Activity.RESULT_OK, intent)
activity?.finish() activity?.finish()
} else { } else {
lastItemClickedPosition = position lastItemClickedId = (row as Identifiable).id
EditableDataActivity.newInstanceForResult( EditableDataActivity.newInstanceForResult(this, it.ordinal, lastItemClickedId, REQUEST_CODE_DETAILS)
this, }
it.ordinal,
(row as Identifiable).id,
REQUEST_CODE_DETAILS
)
}
} }
} }
@ -130,7 +126,7 @@ class DataListFragment : RealmFragment(), LiveRowRepresentableDataSource, RowRep
dataListAdapter = RowRepresentableAdapter(this, this) dataListAdapter = RowRepresentableAdapter(this, this)
val swipeToDelete = SwipeToDeleteCallback(dataListAdapter) { position -> val swipeToDelete = SwipeToDeleteCallback(dataListAdapter) { position ->
deleteItem(position) deleteItem((this.items[position] as Identifiable).id)
} }
val itemTouchHelper = ItemTouchHelper(swipeToDelete) val itemTouchHelper = ItemTouchHelper(swipeToDelete)
@ -156,30 +152,31 @@ class DataListFragment : RealmFragment(), LiveRowRepresentableDataSource, RowRep
/** /**
* Delete item * Delete item
*/ */
private fun deleteItem(position: Int) { private fun deleteItem(itemId: String) {
if (isDetached || activity == null) { if (isDetached || activity == null) {
return return
} }
// Save the delete position & create a copy of the object // Save the delete position & create a copy of the object
val mRecentlyDeletedItem = rowRepresentableForPosition(position) val itemPosition = this.items.indexOfFirst { (it as Identifiable).id == itemId }
lastDeletedItemPosition = position 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 // Check if the object is valid for the deletion
if ((mRecentlyDeletedItem as Deletable).isValidForDelete(this.getRealm())) { if ((itemToDelete as Deletable).isValidForDelete(this.getRealm())) {
deletedItem = getRealm().copyFromRealm(mRecentlyDeletedItem) deletedItem = getRealm().copyFromRealm(itemToDelete)
lastDeletedItemPosition = itemPosition
getRealm().executeTransaction { getRealm().executeTransaction {
mRecentlyDeletedItem.deleteFromRealm() itemToDelete.deleteFromRealm()
} }
dataListAdapter.notifyItemRemoved(position) dataListAdapter.notifyItemRemoved(itemPosition)
showUndoSnackBar() showUndoSnackBar()
} else { } else {
dataListAdapter.notifyItemChanged(position) dataListAdapter.notifyItemChanged(itemPosition)
val builder = AlertDialog.Builder(requireContext()) val builder = AlertDialog.Builder(requireContext())
.setMessage((mRecentlyDeletedItem as Deletable).getFailedDeleteMessage()) .setMessage((itemToDelete as Deletable).getFailedDeleteMessage())
.setNegativeButton(R.string.ok, null) .setNegativeButton(R.string.ok, null)
builder.show() builder.show()
} }

Loading…
Cancel
Save