From dc595c5a0e9c73c25a889b7d8cd58f4fee431d21 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 19 Jun 2017 23:26:19 +0200 Subject: [PATCH] refactor ItemsAdapter --- .../filemanager/adapters/ItemsAdapter.kt | 171 ++++++++++-------- .../filemanager/fragments/ItemsFragment.kt | 8 +- 2 files changed, 105 insertions(+), 74 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/adapters/ItemsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/adapters/ItemsAdapter.kt index 18322311..b6826a5b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/filemanager/adapters/ItemsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/adapters/ItemsAdapter.kt @@ -5,6 +5,7 @@ import android.graphics.drawable.Drawable import android.net.Uri import android.support.v7.view.ActionMode import android.support.v7.widget.RecyclerView +import android.util.SparseArray import android.view.* import com.bignerdranch.android.multiselector.ModalMultiSelectorCallback import com.bignerdranch.android.multiselector.MultiSelector @@ -28,42 +29,53 @@ import java.util.* class ItemsAdapter(val activity: SimpleActivity, var mItems: MutableList, val listener: ItemOperationsListener?, val itemClick: (FileDirItem) -> Unit) : RecyclerView.Adapter() { + val multiSelector = MultiSelector() - val views = ArrayList() val config = activity.config - companion object { - var actMode: ActionMode? = null - val markedItems = HashSet() - var textColor = 0 - var itemCnt = 0 + var actMode: ActionMode? = null + var itemViews = SparseArray() + val selectedPositions = HashSet() - lateinit var folderDrawable: Drawable - lateinit var fileDrawable: Drawable + var textColor = activity.config.textColor - fun toggleItemSelection(itemView: View, select: Boolean, pos: Int = -1) { - itemView.item_frame.isSelected = select - if (pos == -1) - return + lateinit var folderDrawable: Drawable + lateinit var fileDrawable: Drawable - if (select) - markedItems.add(pos) - else - markedItems.remove(pos) + fun toggleItemSelection(select: Boolean, pos: Int) { + itemViews[pos]?.item_frame?.isSelected = select + + if (select) + selectedPositions.add(pos) + else + selectedPositions.remove(pos) + + if (selectedPositions.isEmpty()) { + actMode?.finish() + return } - fun updateTitle(cnt: Int) { - actMode?.title = "$cnt / $itemCnt" - } + updateTitle(selectedPositions.size) + actMode?.invalidate() + } + + fun updateTitle(cnt: Int) { + actMode?.title = "$cnt / ${mItems.size}" } init { - textColor = activity.config.textColor - folderDrawable = activity.resources.getColoredDrawableWithColor(com.simplemobiletools.commons.R.drawable.ic_folder, textColor) + folderDrawable = activity.resources.getColoredDrawableWithColor(R.drawable.ic_folder, textColor) folderDrawable.alpha = 180 - fileDrawable = activity.resources.getColoredDrawableWithColor(com.simplemobiletools.commons.R.drawable.ic_file, textColor) + fileDrawable = activity.resources.getColoredDrawableWithColor(R.drawable.ic_file, textColor) fileDrawable.alpha = 180 - itemCnt = mItems.size + } + + val adapterListener = object : MyAdapterListener { + override fun toggleItemSelectionAdapter(select: Boolean, position: Int) { + toggleItemSelection(select, position) + } + + override fun getSelectedPositions(): HashSet = selectedPositions } val multiSelectorMode = object : ModalMultiSelectorCallback(multiSelector) { @@ -89,14 +101,16 @@ class ItemsAdapter(val activity: SimpleActivity, var mItems: MutableList() - selections.forEach { paths.add(mItems[it].path) } + selectedPositions.forEach { paths.add(mItems[it].path) } PropertiesDialog(activity, paths, config.showHidden) } } @@ -142,8 +155,7 @@ class ItemsAdapter(val activity: SimpleActivity, var mItems: MutableList() - val positions = multiSelector.selectedPositions - positions.forEach { files.add(File(mItems[it].path)) } + selectedPositions.forEach { files.add(File(mItems[it].path)) } val source = if (files[0].isFile) files[0].parent else files[0].absolutePath FilePickerDialog(activity, source, false, config.showHidden, true) { @@ -158,36 +170,47 @@ class ItemsAdapter(val activity: SimpleActivity, var mItems: MutableList(selections.size) - val removeFiles = ArrayList(selections.size) + if (selectedPositions.isEmpty()) + return - activity.handleSAFDialog(File(mItems[selections[0]].path)) { - selections.reverse() - selections.forEach { + val files = ArrayList(selectedPositions.size) + val removeFiles = ArrayList(selectedPositions.size) + + activity.handleSAFDialog(File(mItems[selectedPositions.first()].path)) { + selectedPositions.sortedDescending().forEach { val file = mItems[it] files.add(File(file.path)) removeFiles.add(file) notifyItemRemoved(it) + itemViews.put(it, null) } mItems.removeAll(removeFiles) - markedItems.clear() + selectedPositions.clear() listener?.deleteFiles(files) - itemCnt = mItems.size + + val newItems = SparseArray() + var curIndex = 0 + for (i in 0..itemViews.size() - 1) { + if (itemViews[i] != null) { + newItems.put(curIndex, itemViews[i]) + curIndex++ + } + } + + itemViews = newItems } } private fun getSelectedMedia(): List { - val positions = multiSelector.selectedPositions - val selectedMedia = ArrayList(positions.size) - positions.forEach { selectedMedia.add(mItems[it]) } + val selectedMedia = ArrayList(selectedPositions.size) + selectedPositions.forEach { selectedMedia.add(mItems[it]) } return selectedMedia } @@ -198,11 +221,13 @@ class ItemsAdapter(val activity: SimpleActivity, var mItems: MutableList (Unit)) : SwappingHolder(view, MultiSelector()) { - fun bindView(multiSelectorCallback: ModalMultiSelectorCallback, multiSelector: MultiSelector, fileDirItem: FileDirItem, pos: Int): View { + class ViewHolder(val view: View, val adapterListener: MyAdapterListener, val activity: SimpleActivity, val multiSelectorCallback: ModalMultiSelectorCallback, + val multiSelector: MultiSelector, val listener: ItemOperationsListener?, val itemClick: (FileDirItem) -> (Unit)) : SwappingHolder(view, MultiSelector()) { + fun bindView(fileDirItem: FileDirItem, fileDrawable: Drawable, folderDrawable: Drawable, textColor: Int): View { itemView.apply { item_name.text = fileDirItem.name item_name.setTextColor(textColor) item_details.setTextColor(textColor) - toggleItemSelection(this, markedItems.contains(pos), pos) +// toggleItemSelection(this, selectedPositions.contains(pos), pos) if (fileDirItem.isDirectory) { item_icon.setImageDrawable(folderDrawable) @@ -230,17 +256,8 @@ class ItemsAdapter(val activity: SimpleActivity, var mItems: MutableList + } + interface ItemOperationsListener { fun refreshItems() fun deleteFiles(files: ArrayList) + + fun itemLongClicked(position: Int) } } diff --git a/app/src/main/kotlin/com/simplemobiletools/filemanager/fragments/ItemsFragment.kt b/app/src/main/kotlin/com/simplemobiletools/filemanager/fragments/ItemsFragment.kt index d9ccce76..bf5e4ee3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/filemanager/fragments/ItemsFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/filemanager/fragments/ItemsFragment.kt @@ -203,6 +203,10 @@ class ItemsFragment : android.support.v4.app.Fragment(), ItemsAdapter.ItemOperat return "$type/*" } + override fun refreshItems() { + fillItems() + } + override fun deleteFiles(files: ArrayList) { val hasFolder = files.any { it.isDirectory } (activity as SimpleActivity).deleteFiles(files, hasFolder) { @@ -214,8 +218,8 @@ class ItemsFragment : android.support.v4.app.Fragment(), ItemsAdapter.ItemOperat } } - override fun refreshItems() { - fillItems() + override fun itemLongClicked(position: Int) { + } interface ItemInteractionListener {