Java 如何在listview中使用Android数据绑定,而仍然使用ViewHolder模式?

Java 如何在listview中使用Android数据绑定,而仍然使用ViewHolder模式?,java,android,listview,data-binding,android-viewholder,Java,Android,Listview,Data Binding,Android Viewholder,我有一个Android活动,它从适配器类中的可观察列表中提取数据 我的适配器类中的getView()方法是: @Override public View getView(int position, View convertView, ViewGroup parent) { if (inflater == null) { inflater = (LayoutInflater) parent.getContext() .getSystemSer

我有一个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();
}
这很有效。但是,我在
ActivityTeamMessageListRowBinding…
行的视图适配器中看到Android警告无条件布局膨胀

我一直在研究视图持有者来解决这个问题,但我似乎不知道如何做到这一点,并且仍然使用我的数据绑定。据推测,列表越长,如果不使用ViewHolder,我会看到性能越差

有人知道如何扩展我的
getView(…)
代码以合并一个视图活页夹吗?
我的my_activity_list_row.xml中有一个3
TextView
s和1
ImageView

试试这个:

@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();
}

我没有将数据绑定与
ListView
(我将使用
RecyclerView
)一起使用,但即兴使用,我会尝试这样做。使用断点或日志来确认,当
convertView
不是
null
时,从
getBinding()
返回
binding
的次数比不返回的次数要多(可能一直都是如此-我不清楚数据绑定的缓存是如何工作的)。

DataBindingUtil已经实现了这一点

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    return getViewForResource(mResourceId, position, convertView, parent);
}

@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
    return getViewForResource(mDropDownResourceId, position, convertView, parent);
}

public View getViewForResource(int resourceId, int position, View convertView, ViewGroup parent) {
    final ViewDataBinding binding = (convertView != null) 
                    ? DataBindingUtil.getBinding(convertView) 
                    : DataBindingUtil.inflate(mLayoutInflater, resourceId, parent, false);
    binding.setVariable(BR.viewModel, getItem(position));
    return binding.getRoot();
}

ViewHolder
如何适应此模式?@Brett:
ActivityTeamMessageListRowBinding
是视图持有者。数据绑定框架提供的部分功能是代码生成视图持有者。您将在类中拥有映射到
R.layout.my\u activity\u list\u row
中小部件的字段,这些字段基于它们的ID值。看见