Java 如何在listview中使用Android数据绑定,而仍然使用ViewHolder模式?
我有一个Android活动,它从适配器类中的可观察列表中提取数据 我的适配器类中的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
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中有一个3TextView
s和1ImageView
。试试这个:
@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值。看见