Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cc510d2a authored by tibbi's avatar tibbi
Browse files

rewrite the recyclerview adapter, store viewholders instead of views

parent 953c6b54
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -7,7 +7,7 @@ buildscript {
        propMinSdkVersion = 16
        propTargetSdkVersion = propCompileSdkVersion
        propVersionCode = 1
        propVersionName = '4.1.17'
        propVersionName = '4.2.0'
        kotlin_version = '1.2.50'
        support_libs = '27.1.1'
    }
+2 −2
Original line number Diff line number Diff line
@@ -29,9 +29,9 @@ class FilepickerItemsAdapter(activity: BaseSimpleActivity, val fileDirItems: Lis

    override fun getActionMenuId() = 0

    override fun prepareItemSelection(view: View) {}
    override fun prepareItemSelection(viewHolder: ViewHolder) {}

    override fun markItemSelection(select: Boolean, view: View?) {}
    override fun markItemHolderSelection(select: Boolean, viewHolder: ViewHolder?) {}

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.filepicker_list_item, parent)

+33 −16
Original line number Diff line number Diff line
@@ -28,7 +28,7 @@ abstract class MyRecyclerViewAdapter(val activity: BaseSimpleActivity, val recyc
    protected var primaryColor = baseConfig.primaryColor
    protected var textColor = baseConfig.textColor
    protected var backgroundColor = baseConfig.backgroundColor
    protected var itemViews = SparseArray<View>()
    protected var itemHolders = SparseArray<ViewHolder>()
    protected val selectedPositions = HashSet<Int>()
    protected var positionOffset = 0

@@ -39,9 +39,9 @@ abstract class MyRecyclerViewAdapter(val activity: BaseSimpleActivity, val recyc

    abstract fun getActionMenuId(): Int

    abstract fun prepareItemSelection(view: View)
    abstract fun prepareItemSelection(viewHolder: ViewHolder)

    abstract fun markItemSelection(select: Boolean, view: View?)
    abstract fun markItemHolderSelection(select: Boolean, viewHolder: ViewHolder?)

    abstract fun prepareActionMode(menu: Menu)

@@ -53,15 +53,15 @@ abstract class MyRecyclerViewAdapter(val activity: BaseSimpleActivity, val recyc

    protected fun toggleItemSelection(select: Boolean, pos: Int) {
        if (select) {
            if (itemViews[pos] != null) {
                prepareItemSelection(itemViews[pos])
                selectedPositions.add(pos)
            if (itemHolders[pos] != null) {
                prepareItemSelection(itemHolders[pos])
            }
            selectedPositions.add(pos)
        } else {
            selectedPositions.remove(pos)
        }

        markItemSelection(select, itemViews[pos])
        markItemHolderSelection(select, itemHolders[pos])

        if (selectedPositions.isEmpty()) {
            finishActMode()
@@ -236,7 +236,7 @@ abstract class MyRecyclerViewAdapter(val activity: BaseSimpleActivity, val recyc
        override fun onDestroyActionMode(actionMode: ActionMode?) {
            super.onDestroyActionMode(actionMode)
            selectedPositions.forEach {
                markItemSelection(false, itemViews[it])
                markItemHolderSelection(false, itemHolders[it])
            }
            selectedPositions.clear()
            actBarTextView?.text = ""
@@ -251,23 +251,40 @@ abstract class MyRecyclerViewAdapter(val activity: BaseSimpleActivity, val recyc
    }

    protected fun bindViewHolder(holder: MyRecyclerViewAdapter.ViewHolder, position: Int, view: View) {
        itemViews.put(position, view)
        itemHolders.put(position, holder)
        toggleItemSelection(selectedPositions.contains(position), position)
        holder.itemView.tag = holder
    }

    override fun onViewRecycled(holder: ViewHolder) {
        super.onViewRecycled(holder)
        val pos = itemHolders.indexOfValue(holder)
        try {
            if (pos != -1) {
                itemHolders.removeAt(pos)
            }
        } catch (ignored: ArrayIndexOutOfBoundsException) {
        }
    }

    protected fun removeSelectedItems() {
        val newViewHolders = SparseArray<ViewHolder>()
        val cnt = itemHolders.size()
        for (i in 0..cnt) {
            if (selectedPositions.contains(i)) {
                continue
            }

            val view = itemHolders.get(i, null)
            val newIndex = i - selectedPositions.count { it <= i }
            newViewHolders.put(newIndex, view)
        }
        itemHolders = newViewHolders

        selectedPositions.sortedDescending().forEach {
            notifyItemRemoved(it + positionOffset)
            itemViews.put(it, null)
        }

        val newItems = SparseArray<View>()
        (0 until itemViews.size())
                .filter { itemViews[it] != null }
                .forEachIndexed { curIndex, i -> newItems.put(curIndex, itemViews[i]) }

        itemViews = newItems
        finishActMode()
        fastScroller?.measureRecyclerView()
    }