You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RecyclerView调用notifyDataSetChanged需延迟1ms才生效的问题求助

这问题我之前做自定义输入法时也碰到过,确实挺坑的!你推测的原因没错——在onCreateInputView方法返回视图之前,RecyclerView还没完成和输入法窗口的挂载流程,这时候调用notifyDataSetChanged,RecyclerView还没准备好响应刷新通知。

给你两个比延迟协程更可靠的解决方案:

方案1:利用View的post方法

View的post会把Runnable放到UI线程的消息队列,等View完成attach到窗口后再执行,完全不需要依赖固定延迟:

Kotlin版本

override fun onCreateInputView(): View {
    mainview = layoutInflater.inflate(R.layout.keyboardmain, null)
    // 处理tabs列表的代码
    val tabAdapter = TabAdapter(tabs, this)
    mainview.tabRecyclerView.adapter = tabAdapter
    // 用post确保RecyclerView初始化完成后再刷新
    mainview.tabRecyclerView.post {
        tabAdapter.notifyDataSetChanged()
    }
    return mainview
}

Java版本

@Override
public View onCreateInputView() {
    View mainview = getLayoutInflater().inflate(R.layout.keyboardmain, null);
    // 处理tabs列表的代码
    TabAdapter tabAdapter = new TabAdapter(tabs, this);
    mainview.tabRecyclerView.setAdapter(tabAdapter);
    // 用post确保RecyclerView初始化完成后再刷新
    mainview.tabRecyclerView.post(new Runnable() {
        @Override
        public void run() {
            tabAdapter.notifyDataSetChanged();
        }
    });
    return mainview;
}

方案2:重写onInputViewShown生命周期方法

InputMethodService提供了onInputViewShown方法,这个方法会在输入法视图完全显示出来之后被调用,此时视图肯定已经完成挂载,在这里刷新逻辑更清晰:

Kotlin版本

private lateinit var tabAdapter: TabAdapter

override fun onCreateInputView(): View {
    mainview = layoutInflater.inflate(R.layout.keyboardmain, null)
    // 处理tabs列表的代码
    tabAdapter = TabAdapter(tabs, this)
    mainview.tabRecyclerView.adapter = tabAdapter
    return mainview
}

override fun onInputViewShown() {
    super.onInputViewShown()
    tabAdapter.notifyDataSetChanged()
}

Java版本

private TabAdapter tabAdapter;

@Override
public View onCreateInputView() {
    View mainview = getLayoutInflater().inflate(R.layout.keyboardmain, null);
    // 处理tabs列表的代码
    tabAdapter = new TabAdapter(tabs, this);
    mainview.tabRecyclerView.setAdapter(tabAdapter);
    return mainview;
}

@Override
public void onInputViewShown() {
    super.onInputViewShown();
    if (tabAdapter != null) {
        tabAdapter.notifyDataSetChanged();
    }
}

这两个方案都比固定延迟的协程更可靠,不会因为不同设备的初始化速度差异导致刷新失效,逻辑上也更贴合Android和输入法服务的生命周期规则。

内容的提问来源于stack exchange,提问作者Foobar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:54:11