web-dev-qa-db-ja.com

リストビューでAndroid DataBindingを使用し、それでも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();
}
_

そして、これはうまく機能します。ただし、Androidの警告ViewAdapterからの無条件のレイアウトインフレーションが_ActivityTeamMessageListRowBinding binding ..._行に表示されます。

私はこの問題を修正するためにViewHoldersを調査してきましたが、これを達成し、データバインディングを使用する方法がわからないようです。そしておそらく、リストが長いほど、ViewHolderを使用しないとパフォーマンスが低下します。

ビューバインダーを組み込むために私のgetView(...)コードを拡張する方法を知っている人はいますか?私のmy_activity_list_row.xmlに3つのTextViewsと1つのImageViewがあります。

9
Brett

これを試して:

_@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を使用します)、カフから外して、これを試してみます。ブレークポイントまたはロギングを使用して、convertViewnullでない場合に、getBinding()からbindingが返される頻度が高いことを確認します(おそらくすべて時間—データバインディングのキャッシングがどのように機能するかについて私はぼんやりしています)。

20
CommonsWare