ObservableListAdapter.java revision c7cd9c61e55b43b712d20f855ca59d6fbc49e5b1
1/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package android.databinding.adapters;
17
18import android.content.Context;
19import android.databinding.ObservableList;
20import android.databinding.ObservableList.OnListChangedCallback;
21import android.view.LayoutInflater;
22import android.view.View;
23import android.view.ViewGroup;
24import android.widget.BaseAdapter;
25import android.widget.TextView;
26
27import java.util.List;
28
29class ObservableListAdapter<T> extends BaseAdapter {
30    private List<T> mList;
31    private ObservableList.OnListChangedCallback mListChangedCallback;
32    private final Context mContext;
33    private final int mDropDownResourceId;
34    private final int mResourceId;
35    private final int mTextViewResourceId;
36    private final LayoutInflater mLayoutInflater;
37
38    public ObservableListAdapter(Context context, List<T> list, int resourceId,
39            int dropDownResourceId, int textViewResourceId) {
40        mContext = context;
41        mResourceId = resourceId;
42        mDropDownResourceId = dropDownResourceId;
43        mTextViewResourceId = textViewResourceId;
44        mLayoutInflater = (resourceId == 0) ? null :
45                (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
46        setList(list);
47    }
48
49    public void setList(List<T> list) {
50        if (mList == list) {
51            return;
52        }
53        if (mList instanceof ObservableList) {
54            ((ObservableList) mList).removeOnListChangedCallback(mListChangedCallback);
55        }
56        mList = list;
57        if (mList instanceof ObservableList) {
58            if (mListChangedCallback == null) {
59                mListChangedCallback = new OnListChangedCallback() {
60                    @Override
61                    public void onChanged(ObservableList observableList) {
62                        notifyDataSetChanged();
63                    }
64
65                    @Override
66                    public void onItemRangeChanged(ObservableList observableList, int i,
67                            int i1) {
68                        notifyDataSetChanged();
69                    }
70
71                    @Override
72                    public void onItemRangeInserted(ObservableList observableList, int i,
73                            int i1) {
74                        notifyDataSetChanged();
75                    }
76
77                    @Override
78                    public void onItemRangeMoved(ObservableList observableList, int i, int i1,
79                            int i2) {
80                        notifyDataSetChanged();
81                    }
82
83                    @Override
84                    public void onItemRangeRemoved(ObservableList observableList, int i,
85                            int i1) {
86                        notifyDataSetChanged();
87                    }
88                };
89            }
90            ((ObservableList) mList).addOnListChangedCallback(mListChangedCallback);
91        }
92        notifyDataSetChanged();
93    }
94
95    @Override
96    public int getCount() {
97        return mList.size();
98    }
99
100    @Override
101    public Object getItem(int position) {
102        return mList.get(position);
103    }
104
105    @Override
106    public long getItemId(int position) {
107        return position;
108    }
109
110    @Override
111    public View getView(int position, View convertView, ViewGroup parent) {
112        return getViewForResource(mResourceId, position, convertView, parent);
113    }
114
115    @Override
116    public View getDropDownView(int position, View convertView, ViewGroup parent) {
117        return getViewForResource(mDropDownResourceId, position, convertView, parent);
118    }
119
120    public View getViewForResource(int resourceId, int position, View convertView,
121            ViewGroup parent) {
122        if (convertView == null) {
123            if (resourceId == 0) {
124                convertView = new TextView(mContext);
125            } else {
126                convertView = mLayoutInflater.inflate(resourceId, parent, false);
127            }
128        }
129        TextView text = (TextView) (mTextViewResourceId == 0 ? convertView :
130                convertView.findViewById(mTextViewResourceId));
131        T item = mList.get(position);
132        CharSequence value;
133        if (item instanceof CharSequence) {
134            value = (CharSequence) item;
135        } else {
136            value = String.valueOf(item);
137        }
138        text.setText(value);
139        return convertView;
140    }
141}
142