渲染时Android数据绑定滞后

kta*_*mas 3 data-binding android

我正在使用Android数据绑定RecyclerView.Adapter.上AdapteronCreateViewHolder我打电话:

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

所以ListItemMyDataBinding是一个代表list_item_my_data.xml.

AdapteronBindViewHolder看起来是这样的:

@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
    MyData myData = mDataList.get(position);

    holder.render(myData);

    ....
}
Run Code Online (Sandbox Code Playgroud)

最后,render我的功能MyViewHolder看起来像这样:

public void render(MyData data, boolean expand) {
    mBinding.setData(data); // mBinding is an instance of ListItemMyDataBinding
}
Run Code Online (Sandbox Code Playgroud)

在我的xmls中有一些数据绑定:

<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}" />
Run Code Online (Sandbox Code Playgroud)

我在一个可搜索的列表中使用这种方法,所以我在列表顶部有一个搜索字段.一旦用户输入新的搜索词,列表就会被清除并通知有关更改,一旦响应从服务器返回,我将所有结果添加到列表中并再次通知更改.

最后问题是发生以下情况:

  • 输入新的搜索词:清除列表,删除项目[确定]
  • 响应从服务器返回[确定]
  • 我将所有项目添加到列表中并通知适配器有关更改[确定]
  • 在几分之一秒内,旧值出现在列表中,列表项将仅在[ NOT ] 之后使用新值更新

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

你有什么建议我怎么能很好地避免这种"眨眼/滞后"效应,我做错了什么?

谢谢

Bla*_*elt 8

呼叫

mBinding.executePendingBindings ();
Run Code Online (Sandbox Code Playgroud)

刚过 mBinding.setData(data);