如何在列表视图中使用Android DataBinding并仍然使用ViewHolder模式?

Bre*_*ett 4 java data-binding android listview android-viewholder

我有一个Android活动,它从适配器类中的可观察列表中提取数据.

getView()在我的适配器类的方法是:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (inflater == null) {
        inflater = (LayoutInflater) parent.getContext()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    // Perform the binding
    ActivityTeamMessageListRowBinding binding = DataBindingUtil.inflate(inflater, R.layout.my_activity_list_row, parent, false);
    binding.setInfo(list.get(position));
    binding.executePendingBindings();

    // Return the bound view
    return binding.getRoot();
}
Run Code Online (Sandbox Code Playgroud)

这很有效.但是,我看到了Android的警告从视图适配器无条件布局通胀ActivityTeamMessageListRowBinding binding ...线.

我一直在研究ViewHolders来解决这个问题,但我似乎无法弄清楚如何完成这个并仍然使用我的数据绑定.并且可能是,列表越长,我在不使用ViewHolder的情况下看到的性能就越差.

有谁知道如何扩展我的getView(...)代码以合并视图绑定器?我的my_activity_list_row.xml中有3 TextView秒和1 .ImageView

Com*_*are 19

试试这个:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (inflater == null) {
        inflater = ((Activity) parent.getContext()).getLayoutInflater();
    }

    // Perform the binding

    ActivityTeamMessageListRowBinding binding = DataBindingUtil.getBinding(convertView);

    if (binding == null) {
        binding = DataBindingUtil.inflate(inflater, R.layout.my_activity_list_row, parent, false);
    }

    binding.setInfo(list.get(position));
    binding.executePendingBindings();

    // Return the bound view
    return binding.getRoot();
}
Run Code Online (Sandbox Code Playgroud)

我没有使用数据绑定ListView(我将使用RecyclerView),但从袖口,这是我尝试.使用断点或日志来确认,如果convertView不是null,你会经常binding回来getBinding()(也许所有的时间 - 我对数据绑定的缓存如何工作很朦胧).

  • @Brett:`ActivityTeamMessageListRowBinding`*是*视图持有者.数据绑定框架为您提供的部分内容是代码生成视图持有者.根据它们的ID值,您将在类中包含映射到`R.layout.my_activity_list_row`中的小部件的字段.请参阅[文档](https://developer.android.com/topic/libraries/data-binding/index.html#views_with_ids). (3认同)