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
相关产品推荐
相关产品推荐

