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

时间:2016-11-11 22:16:59

标签: 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()
                .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

2 个答案:

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