我正在使用带有 RecyclerView.Adapter 的 Android 数据绑定(bind)。
AdapteronCreateViewHolder 上,我调用:

public TransfersViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    return new MyViewHolder(
                ListItemMyDataBinding.inflate(
                        LayoutInflater.from(parent.getContext()),
                        parent,
                        false));
}

所以 ListItemMyDataBindinglist_item_my_data.xml 的表示。
AdapteronBindViewHolder 看起来像这样:
@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
    MyData myData = mDataList.get(position);

    holder.render(myData);

    ....
}

最后,我的 renderMyViewHolder 函数如下所示:
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]
  • 在几分之一秒内,旧值出现在列表中,并且列表项将在此之后更新为新值 [ NOT OK ]

  • 据我了解,这是因为 View 被重用,并且作为第一步,适配器意识到它可以重用 View 并显示它,并且只有(几分之一秒)在它应用布局更改后(通过数据绑定(bind)) ,这就是为什么我看到旧值闪烁的原因。这很烦人。
    如果在函数 render 中我手动为 View 设置了默认值(例如 setText("") 上的 TextView ),那么我看不到闪烁效果,但这不是我想要的解决方案。

    你有什么建议我怎样才能很好地避免这种“闪烁/滞后”效果,我做错了什么?

    谢谢

    最佳答案

    称呼

    mBinding.executePendingBindings ();
    

    就在 mBinding.setData(data); 之后

    关于渲染时Android数据绑定(bind)滞后,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41021777/

    10-10 23:54