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; 21b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Guptaimport com.android.ide.common.rendering.api.LayoutlibCallback; 22ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.ide.common.rendering.api.ResourceReference; 23701669c982299fb5b024e1e320138fb03506d738Deepanshu Guptaimport com.android.util.Pair; 24ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 25ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.view.View; 26ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.view.ViewGroup; 27ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.widget.AdapterView; 28701669c982299fb5b024e1e320138fb03506d738Deepanshu Guptaimport android.widget.BaseAdapter; 29ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.widget.ListAdapter; 30ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport android.widget.SpinnerAdapter; 31ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 32ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport java.util.ArrayList; 33ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport java.util.List; 34ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 35ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski/** 36ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Fake adapter to do fake data binding in {@link AdapterView} objects for {@link ListAdapter} 37ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * and {@link SpinnerAdapter}. 38ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 39ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski */ 40701669c982299fb5b024e1e320138fb03506d738Deepanshu Guptapublic class FakeAdapter extends BaseAdapter { 41ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 42ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // don't use a set because the order is important. 43ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski private final List<ResourceReference> mTypes = new ArrayList<ResourceReference>(); 44b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta private final LayoutlibCallback mCallback; 45701669c982299fb5b024e1e320138fb03506d738Deepanshu Gupta private final ResourceReference mAdapterRef; 46701669c982299fb5b024e1e320138fb03506d738Deepanshu Gupta private final List<AdapterItem> mItems = new ArrayList<AdapterItem>(); 47701669c982299fb5b024e1e320138fb03506d738Deepanshu Gupta private boolean mSkipCallbackParser = false; 48ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 49ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public FakeAdapter(ResourceReference adapterRef, AdapterBinding binding, 50b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta LayoutlibCallback callback) { 51701669c982299fb5b024e1e320138fb03506d738Deepanshu Gupta mAdapterRef = adapterRef; 52701669c982299fb5b024e1e320138fb03506d738Deepanshu Gupta mCallback = callback; 53ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 54701669c982299fb5b024e1e320138fb03506d738Deepanshu Gupta final int repeatCount = binding.getRepeatCount(); 55701669c982299fb5b024e1e320138fb03506d738Deepanshu Gupta final int itemCount = binding.getItemCount(); 56ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 57ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // Need an array to count for each type. 58ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // This is likely too big, but is the max it can be. 59ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski int[] typeCount = new int[itemCount]; 60ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 61ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // We put several repeating sets. 62ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski for (int r = 0 ; r < repeatCount ; r++) { 63ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // loop on the type of list items, and add however many for each type. 64701669c982299fb5b024e1e320138fb03506d738Deepanshu Gupta for (DataBindingItem dataBindingItem : binding) { 65ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski ResourceReference viewRef = dataBindingItem.getViewReference(); 66ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski int typeIndex = mTypes.indexOf(viewRef); 67ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (typeIndex == -1) { 68ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski typeIndex = mTypes.size(); 69ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski mTypes.add(viewRef); 70ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 71ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 72ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski int count = dataBindingItem.getCount(); 73ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 74ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski int index = typeCount[typeIndex]; 75ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski typeCount[typeIndex] += count; 76ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 77ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski for (int k = 0 ; k < count ; k++) { 78ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski mItems.add(new AdapterItem(dataBindingItem, typeIndex, mItems.size(), index++)); 79ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 80ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 81ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 82ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 83ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 84ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @Override 85ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public boolean isEnabled(int position) { 86ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return true; 87ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 88ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 89ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @Override 90ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public int getCount() { 91ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return mItems.size(); 92ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 93ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 94ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @Override 95ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public Object getItem(int position) { 96ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return mItems.get(position); 97ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 98ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 99ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @Override 100ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public long getItemId(int position) { 101ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return position; 102ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 103ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 104ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @Override 105ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public int getItemViewType(int position) { 106ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return mItems.get(position).getType(); 107ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 108ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 109ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @Override 110ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public View getView(int position, View convertView, ViewGroup parent) { 111ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // we don't care about recycling here because we never scroll. 112ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski AdapterItem item = mItems.get(position); 113b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta @SuppressWarnings("deprecation") 114b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta Pair<View, Boolean> pair = AdapterHelper.getView(item, null, parent, mCallback, 115b111e84752652ec862efa7e0fcaa224430feb97fDeepanshu Gupta mAdapterRef, mSkipCallbackParser); 116701669c982299fb5b024e1e320138fb03506d738Deepanshu Gupta mSkipCallbackParser = pair.getSecond(); 117701669c982299fb5b024e1e320138fb03506d738Deepanshu Gupta return pair.getFirst(); 118ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 119ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 120ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @Override 121ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public int getViewTypeCount() { 122ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return mTypes.size(); 123ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 124ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 125ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // ---- SpinnerAdapter 126ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 127ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @Override 128ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public View getDropDownView(int position, View convertView, ViewGroup parent) { 129ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // pass 130ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return null; 131ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 132ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski} 133