小编ill*_*zor的帖子

带有 DiffUtil.ItemCallback 的 ListAdapter 始终认为对象相同

我正在尝试将 ListAdapter 与 Room 和 LifeData 一起使用。但是我遇到了 DiffUtil.ItemCallback 的奇怪行为 - areContentsTheSame() 方法中的对象总是相同的。添加和删​​除对象没问题,但更改内容有问题。

物品类别:

@Entity(tableName = "item")
data class Item(var num: Int) {

    @PrimaryKey(autoGenerate = true)
    var key: Int = 0

}
Run Code Online (Sandbox Code Playgroud)

适配器类

class LifeAdapter : ListAdapter<Item, LifeAdapter.ViewHolder>(DiffCallback()) {

    private class DiffCallback : DiffUtil.ItemCallback<Item>() {
        override fun areItemsTheSame(oldItem: Item, newItem: Item) = oldItem.key == newItem.key
        override fun areContentsTheSame(oldItem: Item, newItem: Item) = oldItem.num == newItem.num
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.item_item, parent, false)
        return …
Run Code Online (Sandbox Code Playgroud)

android android-recyclerview

12
推荐指数
2
解决办法
5983
查看次数

如何从外部更新可组合状态?

例如,它在可组合函数中使用 state{}。

@Composable
fun CounterButton(text: String) {
    val count = state { 0 }

    Button(
        modifier = Modifier.padding(8.dp),
        onClick = { count.value++ }) {
        Text(text = "$text ${count.value}")
    }
}
Run Code Online (Sandbox Code Playgroud)

但是如何在可组合函数之外更新值呢?我发现了一个 mutableStateOf() 函数和 MutableState 接口,可以在可组合函数之外创建,但值更新后没有效果。

我的尝试不起作用的例子:

private val timerState = mutableStateOf("no value", StructurallyEqual)

@Composable
private fun TimerUi() {
    Button(onClick = presenter::onTimerButtonClick) {
        Text(text = "Timer Button")
    }
    Text(text = timerState.value)
}

override fun updateTime(time: String) {
    timerState.value = time
}
Run Code Online (Sandbox Code Playgroud)

Compose版本是0.1.0-dev14

android android-jetpack-compose

9
推荐指数
1
解决办法
3811
查看次数

如何将数组添加到okhttp体(POST)

现在我将数组作为字符串添加到正文:

RequestBody body = new FormEncodingBuilder()
    .add("profiles", "[122, 125, 336]")
    .build();
Run Code Online (Sandbox Code Playgroud)

但服务器需要post参数上的数组.我怎样才能添加数组而不是字符串?它是否可以与okhttp一起使用?

java android okhttp

6
推荐指数
1
解决办法
3821
查看次数

如何使用aapt2构建可运行的apk?

我有一个简单的android项目。此命令编译资源并构建不带 dex 的 apk:

aapt2 compile project/res/values/strings.xml project/res/layout/activity_main.xml -o project/compiled_res

aapt2 link -o project/apk/unsigned_app.apk -I sdk/platforms/android-28/android.jar --manifest project/src/AndroidManifest.xml -R project/compiled_res/*.flat --java project/src --auto-add-overlay
Run Code Online (Sandbox Code Playgroud)

引用自文档

但是,生成的 APK 不包含 DEX 字节码并且未签名
...
您可以使用其他命令行工具,例如 d8 将 Java 字节码编译为 DEX 字节码,并使用 apksigner 对 APK 进行签名。

好的。我可以:

d8 project/compiled_classes/com/illuzor/buildtest/*.class --output project/dex
Run Code Online (Sandbox Code Playgroud)

但是如何将这个dex打包成apk呢?aapt2 无法识别classes.dex:

在此输入图像描述

我可以通过压缩将classes.dex 添加到我的apk 中:

zip -uj project/apk/unsigned_app.apk project/dex/classes.dex
Run Code Online (Sandbox Code Playgroud)

对齐并签名后即可运行。但一定是另一种方式,更合适。

android aapt2

5
推荐指数
1
解决办法
1365
查看次数

Chrome扩展程序弹出按条件显示

我想通过点击显示弹出窗口,但仅当条件为假时才显示.点击扩展图标后,使用当前名称搜索选项卡.如果找到选项卡,则后台js继续有效.如果没有找到 - 我想显示弹出窗口的说明.在这种情况下,不能理解如何只显示弹出窗口.我可以通过browserAction.setPopup()设置弹出窗口,但弹出窗口只会在下次点击后显示.我只想一次显示我的弹出窗口.这绝对是可能的,我在其他扩展上看到过这种行为.

var pcTabs; // tabs array

chrome.browserAction.onClicked.addListener(buttonClick);

function buttonClick() {
 // getting tabs...
 if(pcTabs.length != 0){
    // working with finded tabs
 } else{ // tabs not found
    // show popup.html here. this is the question
 }
}
Run Code Online (Sandbox Code Playgroud)

更新.这是我的background.js.所有代码也在存储库中.如何将警报替换为弹出窗口?

javascript popup google-chrome-extension

4
推荐指数
1
解决办法
2257
查看次数