我有一个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 binding ...
行上看到了来自视图适配器的Android警告无条件布局通胀。
我一直在研究 ViewHolders 来解决这个问题,但我似乎无法弄清楚如何完成此操作并仍然使用我的数据绑定。并且可能是,列表越长,我在不使用ViewHolder的情况下看到的性能就越差。
是否有人知道如何扩展我的getView(...)
代码以合并视图绑定器?我的TextView和1 ImageView
> my_activity_list_row.xml
答案 0 :(得分: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();
}
我没有使用ListView
的数据绑定(我会使用RecyclerView
),但是从袖口开始,这就是我要尝试的。使用断点或日志记录确认,convertView
不是null
时,binding
getBinding()
经常从AutoreleasingUnsafeMutablePointer<NSArray?>?
回来(也许是所有时间 - 我'我对数据绑定的缓存如何工作很朦胧。)
答案 1 :(得分:0)
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();
}