FakeAdapter.java revision ab775ecdd189b32e35b0d3f4a821502f88b03a4b
1ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski/* 2ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Copyright (C) 2011 The Android Open Source Project 3ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 4ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 5ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * you may not use this file except in compliance with the License. 6ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * You may obtain a copy of the License at 7ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 8ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 9ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 10ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Unless required by applicable law or agreed to in writing, software 11ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 12ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * See the License for the specific language governing permissions and 14ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * limitations under the License. 15ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski */ 16ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 17ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskipackage com.android.layoutlib.bridge.impl.binding; 18ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 19ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.ide.common.rendering.api.AdapterBinding; 20ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.ide.common.rendering.api.DataBindingItem; 21ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.ide.common.rendering.api.IProjectCallback; 22ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.ide.common.rendering.api.ResourceReference; 23ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 24ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.view.View; 25ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.view.ViewGroup; 26ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.widget.AdapterView; 27ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.widget.ListAdapter; 28ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.widget.SpinnerAdapter; 29ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 30ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport java.util.ArrayList; 31ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport java.util.List; 32ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 33ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski/** 34ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Fake adapter to do fake data binding in {@link AdapterView} objects for {@link ListAdapter} 35ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * and {@link SpinnerAdapter}. 36ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 37ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski */ 38ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskipublic class FakeAdapter extends BaseAdapter implements ListAdapter, SpinnerAdapter { 39ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 40ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // don't use a set because the order is important. 41ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski private final List<ResourceReference> mTypes = new ArrayList<ResourceReference>(); 42ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 43ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public FakeAdapter(ResourceReference adapterRef, AdapterBinding binding, 44ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski IProjectCallback callback) { 45ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski super(adapterRef, binding, callback); 46ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 47ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski final int repeatCount = getBinding().getRepeatCount(); 48ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski final int itemCount = getBinding().getItemCount(); 49ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 50ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // Need an array to count for each type. 51ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // This is likely too big, but is the max it can be. 52ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski int[] typeCount = new int[itemCount]; 53ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 54ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // We put several repeating sets. 55ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski for (int r = 0 ; r < repeatCount ; r++) { 56ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // loop on the type of list items, and add however many for each type. 57ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski for (DataBindingItem dataBindingItem : getBinding()) { 58ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski ResourceReference viewRef = dataBindingItem.getViewReference(); 59ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski int typeIndex = mTypes.indexOf(viewRef); 60ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (typeIndex == -1) { 61ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski typeIndex = mTypes.size(); 62ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski mTypes.add(viewRef); 63ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 64ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 65ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski int count = dataBindingItem.getCount(); 66ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 67ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski int index = typeCount[typeIndex]; 68ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski typeCount[typeIndex] += count; 69ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 70ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski for (int k = 0 ; k < count ; k++) { 71ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski mItems.add(new AdapterItem(dataBindingItem, typeIndex, mItems.size(), index++)); 72ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 73ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 74ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 75ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 76ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 77ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @Override 78ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public boolean isEnabled(int position) { 79ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return true; 80ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 81ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 82ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @Override 83ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public int getCount() { 84ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return mItems.size(); 85ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 86ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 87ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @Override 88ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public Object getItem(int position) { 89ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return mItems.get(position); 90ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 91ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 92ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @Override 93ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public long getItemId(int position) { 94ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return position; 95ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 96ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 97ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @Override 98ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public int getItemViewType(int position) { 99ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return mItems.get(position).getType(); 100ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 101ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 102ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @Override 103ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public View getView(int position, View convertView, ViewGroup parent) { 104ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // we don't care about recycling here because we never scroll. 105ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski AdapterItem item = mItems.get(position); 106ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return getView(item, null /*parentGroup*/, convertView, parent); 107ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 108ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 109ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @Override 110ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public int getViewTypeCount() { 111ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return mTypes.size(); 112ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 113ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 114ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // ---- SpinnerAdapter 115ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 116ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @Override 117ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public View getDropDownView(int position, View convertView, ViewGroup parent) { 118ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // pass 119ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return null; 120ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 121ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski} 122