Android RecyclerView滑动以仅在第一个元素上绘制的图标进行删除

时间:2018-11-16 14:26:35

标签: android android-recyclerview kotlin

一切正常,但一件事情却没有真正起作用。 如您在图像中看到的那样,删除图标仅呈现在回收者视图列表的第一个元素上。

enter image description here enter image description here

这是我的ItemTouchHelper类的代码:

class Sale: CustomStringConvertible {
    var soldBy:String
    var amount:Double

    init(soldBy:String, amount:Double) {
        self.soldBy = soldBy
        self.amount = amount
    }

    //This lets us use string interpolation to display a `Sale` object
    var description: String {
        return "Sale(soldBy:\"\(soldBy)\",amount:\(amount)"
    }
}

let sales: [Sale] = [Sale(soldBy: "ABC", amount: 1200.34),
                      Sale(soldBy: "ABC", amount: 999.34),
                      Sale(soldBy: "ABC", amount: 3499.99),
                      Sale(soldBy: "DEF", amount: 333.32),
                      Sale(soldBy: "DEF", amount: 778.12)]


let output: [Sale] = sales.reduce([String:Double]()) { (result, sale) -> [String:Double] in
    var result = result
    result[sale.soldBy, default: 0.0] += sale.amount
    return result
}
    //Map the dictionary from the above back to an array
    .map { Sale(soldBy: $0.key, amount: $0.value) }

    //Sort the output back into alphabetical order by soldBy (if desired)
    //Note that sorting will take time, so only do this step if needed.
    .sorted { $0.soldBy < $1.soldBy }

print(output)

也许加载在课程开头的图标只能使用一次?我已经尝试将其转换为位图并使用它。我还尝试将其加载到onChildDraw函数中。

2 个答案:

答案 0 :(得分:2)

解决方案太简单了。我一直使用itemView.height而不是itemView.top

画布包含所有项目。并非每个项目都有自己的画布。所以我也必须添加以上项目的高度。

工作代码如下:

val top = itemView.top + (itemView.height - intrinsicHeight) / 2
val left = itemView.width - intrinsicWidth - (itemView.height - intrinsicHeight) / 2
val right = left + intrinsicHeight
val bottom = top + intrinsicHeight

if (dX < 0) {
    background.setBounds(itemView.right + dX.toInt(), itemView.top, itemView.right, itemView.bottom)
    icon.setBounds(left, top, right, bottom)
} else if (dX > 0) {
    background.setBounds(itemView.left + dX.toInt(), itemView.top, itemView.left, itemView.bottom)
    icon.setBounds(top, top, top, bottom)
}
background.draw(c)
icon.draw(c)

答案 1 :(得分:0)

您是否检查了此参数的值:isCurrentlyActive?

我猜图像创建(图标)没有错误。因为图像是第一次成功创建的。因此,问题出在循环中。

  if (dX < 0) {...}else{...}

在这里,无论dX的值如何,图像都会添加到子级(行)中。

if (dX != 0f && isCurrentlyActive) 

这是代码中唯一的检查点。从技术上讲,如果isCurrentlyActive布尔值为false,则会跳过整个块。