/*
 *  Copyright 2015 Fabio Collini.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package it.cosenonjaviste.demomv2m.ui.list;

import android.databinding.ObservableArrayList;
import android.databinding.ObservableList;
import android.support.v7.widget.RecyclerView;

public abstract class BindableAdapter<T> extends RecyclerView.Adapter<BindableViewHolder<?, T>> {

    private ObservableArrayList<T> items;

    public BindableAdapter(ObservableArrayList<T> items) {
        this.items = items;
        items.addOnListChangedCallback(new WeakOnListChangedCallback<>(new ObservableList.OnListChangedCallback<ObservableList<T>>() {
            @Override public void onChanged(ObservableList<T> sender) {
                notifyDataSetChanged();
            }

            @Override public void onItemRangeChanged(ObservableList<T> sender, int positionStart, int itemCount) {
                notifyItemRangeChanged(positionStart, itemCount);
            }

            @Override public void onItemRangeInserted(ObservableList<T> sender, int positionStart, int itemCount) {
                notifyItemRangeInserted(positionStart, itemCount);
            }

            @Override public void onItemRangeMoved(ObservableList<T> sender, int fromPosition, int toPosition, int itemCount) {
                notifyDataSetChanged();
            }

            @Override public void onItemRangeRemoved(ObservableList<T> sender, int positionStart, int itemCount) {
                notifyItemRangeRemoved(positionStart, itemCount);
            }
        }));
    }

    @Override public void onBindViewHolder(BindableViewHolder<?, T> viewHolder, int i) {
        viewHolder.bind(items.get(i));
    }

    @Override public int getItemCount() {
        return items.size();
    }
}

@@ -877,16 +877,114 @@
  T%3E%3E %7B%0A%0A
+    private final ObservableList.OnListChangedCallback%3CObservableList%3CT%3E%3E onListChangedCallback;%0A%0A
     priv
@@ -1017,16 +1017,16 @@
  items;%0A
-
 %0A    pub
@@ -1117,48 +1117,61 @@
     
-items.addOnListChangedCallback(new WeakO
+//saved as field to avoid gargabe collector%0A        o
 nLis
@@ -1190,11 +1190,11 @@
 back
-%3C%3E(
+ = 
 new 
@@ -2161,16 +2161,110 @@
        %7D
+;%0A        items.addOnListChangedCallback(new WeakOnListChangedCallback%3C%3E(onListChangedCallback
 ));%0A    

Fix weak reference