我正在使用带有 RecyclerView.Adapter
的 Android 数据绑定(bind)。
在 Adapter
的 onCreateViewHolder
上,我调用:
public TransfersViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new MyViewHolder(
ListItemMyDataBinding.inflate(
LayoutInflater.from(parent.getContext()),
parent,
false));
}
所以 ListItemMyDataBinding
是 list_item_my_data.xml
的表示。
Adapter
的 onBindViewHolder
看起来像这样:
@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
MyData myData = mDataList.get(position);
holder.render(myData);
....
}
最后,我的 MyViewHolder
的 render
函数如下所示:
public void render(MyData data, boolean expand) {
mBinding.setData(data); // mBinding is an instance of ListItemMyDataBinding
}
在我的 xml
中有一些数据绑定(bind):
<data>
<import type="com.example.MyData" />
<variable
name="data"
type="MyData" />
</data>
...
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{data.userName}" />
我在可搜索列表中使用这种方法,所以我在列表顶部有一个搜索字段。用户输入新的搜索词后,列表将被清除并通知更改,一旦响应从服务器返回,我将所有结果添加到列表并再次通知更改。
最后问题是会发生以下情况:
- 输入了新的搜索词:列表已清除,项目已删除[确定]
- 响应从服务器返回 [OK]
- 我将所有项目添加到列表中并通知适配器有关更改 [OK]
- 有几分之一秒的时间,旧值出现在列表中,列表项将仅在此之后更新为新值 [不正常]
据我了解,这是因为 View
被重用,作为第一步,适配器意识到它可以重用 View 并显示它,并且仅在它之后(几分之一秒)应用布局中的更改(通过数据绑定(bind)),这就是我看到旧值闪烁的原因。这很烦人。
如果在函数 render
中我手动为 View 设置默认值(例如 TextView
上的 setText("")
),那么我看不到闪烁效果,但这不是我想要的解决方案。
你有什么建议我怎样才能很好地避免这种“闪烁/滞后”效果,我做错了什么?
谢谢
最佳答案
打电话
mBinding.executePendingBindings ();
就在 mBinding.setData(data);
之后
关于渲染时 Android 数据绑定(bind)滞后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41021777/