15cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount/*
25cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount * Copyright (C) 2015 The Android Open Source Project
35cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount *
45cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount * Licensed under the Apache License, Version 2.0 (the "License");
55cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount * you may not use this file except in compliance with the License.
65cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount * You may obtain a copy of the License at
75cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount *
85cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount *      http://www.apache.org/licenses/LICENSE-2.0
95cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount *
105cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount * Unless required by applicable law or agreed to in writing, software
115cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount * distributed under the License is distributed on an "AS IS" BASIS,
125cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount * See the License for the specific language governing permissions and
145cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount * limitations under the License.
155cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount */
16fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountpackage android.databinding;
175cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount
185cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mountimport java.util.List;
195cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount
20722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount/**
21722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount * A {@link List} that notifies when changes are made. An ObservableList bound to the UI
22722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount * will keep the it up-to-date when changes occur.
23722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount * <p>
24722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount * The ObservableList must notify its callbacks whenever a change to the list occurs, using
25722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount * {@link OnListChangedCallback}.
26722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount * <p>
27722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount * ObservableArrayList implements ObservableList with an underlying ArrayList.
28722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount * ListChangeRegistry can help in maintaining the callbacks of other implementations.
29722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount *
30722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount * @see Observable
31722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount * @see ObservableMap
32722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount */
335cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mountpublic interface ObservableList<T> extends List<T> {
34722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount
35722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount    /**
36722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount     * Adds a callback to be notified when changes to the list occur.
37722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount     * @param callback The callback to be notified on list changes
38722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount     */
39722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount    void addOnListChangedCallback(OnListChangedCallback<? extends ObservableList<T>> callback);
40722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount
41722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount    /**
42722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount     * Removes a callback previously added.
43722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount     * @param callback The callback to remove.
44722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount     */
45722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount    void removeOnListChangedCallback(OnListChangedCallback<? extends ObservableList<T>> callback);
46722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount
47722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount    /**
48722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount     * The callback that is called by ObservableList when the list has changed.
49722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount     */
50722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount    abstract class OnListChangedCallback<T extends ObservableList> {
51722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount
52722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount        /**
53722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount         * Called whenever a change of unknown type has occurred, such as the entire list being
54722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount         * set to new values.
55722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount         *
56722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount         * @param sender The changing list.
57722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount         */
58722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount        public abstract void onChanged(T sender);
59722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount
60722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount        /**
61722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount         * Called whenever one or more items in the list have changed.
62722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount         * @param sender The changing list.
63722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount         * @param positionStart The starting index that has changed.
64722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount         * @param itemCount The number of items that have changed.
65722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount         */
66722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount        public abstract void onItemRangeChanged(T sender, int positionStart, int itemCount);
67722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount
68722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount        /**
69722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount         * Called whenever items have been inserted into the list.
70722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount         * @param sender The changing list.
71722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount         * @param positionStart The insertion index
72722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount         * @param itemCount The number of items that have been inserted
73722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount         */
74722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount        public abstract void onItemRangeInserted(T sender, int positionStart, int itemCount);
75722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount
76722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount        /**
77722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount         * Called whenever items in the list have been moved.
78722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount         * @param sender The changing list.
79722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount         * @param fromPosition The position from which the items were moved
80722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount         * @param toPosition The destination position of the items
81722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount         * @param itemCount The number of items moved
82722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount         */
83722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount        public abstract void onItemRangeMoved(T sender, int fromPosition, int toPosition,
84722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount                int itemCount);
85722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount
86722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount        /**
87722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount         * Called whenever items in the list have been deleted.
88722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount         * @param sender The changing list.
89722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount         * @param positionStart The starting index of the deleted items.
90722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount         * @param itemCount The number of items removed.
91722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount         */
92722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount        public abstract void onItemRangeRemoved(T sender, int positionStart, int itemCount);
93722fe711207a37783dfa7142284b0ebe5bd503fbGeorge Mount    }
945cd681c345db8f606d7d5a8662e20e059f21a86cGeorge Mount}
95