1 /* 2 * Copyright (C) 2007 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 */ 16 17 package android.util; 18 19 import android.content.Context; 20 import android.view.Gravity; 21 import android.view.View; 22 import android.view.ViewGroup; 23 import android.widget.AbsListView; 24 import android.widget.Button; 25 import android.widget.LinearLayout; 26 import android.widget.TextView; 27 28 /** 29 * Reusable methods for creating more complex list items. 30 */ 31 public class ListItemFactory { 32 33 /** 34 * Create a view with a button at the top and bottom, with filler in between. 35 * The filler is sized to take up any space left over within desiredHeight. 36 * 37 * @param position The position within the list. 38 * @param context The context. 39 * @param desiredHeight The desired height of the entire view. 40 * @return The created view. 41 */ twoButtonsSeparatedByFiller(int position, Context context, int desiredHeight)42 public static View twoButtonsSeparatedByFiller(int position, Context context, int desiredHeight) { 43 if (desiredHeight < 90) { 44 throw new IllegalArgumentException("need at least 90 pixels of height " + 45 "to create the two buttons and leave 10 pixels for the filler"); 46 } 47 48 final LinearLayout ll = new LinearLayout(context); 49 ll.setOrientation(LinearLayout.VERTICAL); 50 51 final LinearLayout.LayoutParams buttonLp = 52 new LinearLayout.LayoutParams( 53 ViewGroup.LayoutParams.MATCH_PARENT, 54 50); 55 56 final Button topButton = new Button(context); 57 topButton.setLayoutParams( 58 buttonLp); 59 topButton.setText("top (position " + position + ")"); 60 ll.addView(topButton); 61 62 final TextView middleFiller = new TextView(context); 63 middleFiller.setLayoutParams(new LinearLayout.LayoutParams( 64 ViewGroup.LayoutParams.MATCH_PARENT, 65 desiredHeight - 100)); 66 middleFiller.setText("filler"); 67 ll.addView(middleFiller); 68 69 final Button bottomButton = new Button(context); 70 bottomButton.setLayoutParams(buttonLp); 71 bottomButton.setText("bottom (position " + position + ")"); 72 ll.addView(bottomButton); 73 ll.setTag("twoButtons"); 74 return ll; 75 } 76 77 public enum Slot { 78 Left, 79 Middle, 80 Right 81 } 82 83 /** 84 * Create a horizontal linear layout divided into thirds (with some margins 85 * separating the thirds), filled with buttons into some slots. 86 * @param context The context. 87 * @param desiredHeight The height of the LL. 88 * @param slots Which slots to fill with buttons. 89 * @return The linear layout. 90 */ horizontalButtonSlots(Context context, int desiredHeight, Slot... slots)91 public static View horizontalButtonSlots(Context context, int desiredHeight, Slot... slots) { 92 93 final LinearLayout ll = new LinearLayout(context); 94 ll.setOrientation(LinearLayout.HORIZONTAL); 95 96 final LinearLayout.LayoutParams lp 97 = new LinearLayout.LayoutParams(0, desiredHeight); 98 lp.setMargins(10, 0, 10, 0); 99 lp.weight = 0.33f; 100 101 boolean left = false; 102 boolean middle = false; 103 boolean right = false; 104 for (Slot slot : slots) { 105 switch (slot) { 106 case Left: 107 left = true; 108 break; 109 case Middle: 110 middle = true; 111 break; 112 case Right: 113 right = true; 114 break; 115 } 116 } 117 118 if (left) { 119 final Button button = new Button(context); 120 button.setText("left"); 121 ll.addView(button, lp); 122 } else { 123 ll.addView(new View(context), lp); 124 } 125 126 if (middle) { 127 final Button button = new Button(context); 128 button.setText("center"); 129 ll.addView(button, lp); 130 } else { 131 ll.addView(new View(context), lp); 132 } 133 134 if (right) { 135 final Button button = new Button(context); 136 button.setText("right"); 137 ll.addView(button, lp); 138 } else { 139 ll.addView(new View(context), lp); 140 } 141 142 return ll; 143 } 144 145 146 /** 147 * Create a button ready to be a list item. 148 * 149 * @param position The position within the list. 150 * @param context The context. 151 * @param text The text of the button 152 * @param desiredHeight The desired height of the button 153 * @return The created view. 154 */ button(int position, Context context, String text, int desiredHeight)155 public static View button(int position, Context context, String text, int desiredHeight) { 156 TextView result = new Button(context); 157 result.setHeight(desiredHeight); 158 result.setText(text); 159 final ViewGroup.LayoutParams lp = new AbsListView.LayoutParams( 160 ViewGroup.LayoutParams.MATCH_PARENT, 161 ViewGroup.LayoutParams.WRAP_CONTENT); 162 result.setLayoutParams(lp); 163 result.setId(position); 164 result.setTag("button"); 165 return result; 166 } 167 168 /** 169 * Convert an existing button view to display the data at a new position. 170 * 171 * @param convertView Non-null Button created by {@link #button} 172 * @param text The text of the button 173 * @param position The position withion the list 174 * @return The converted view 175 */ convertButton(View convertView, String text, int position)176 public static View convertButton(View convertView, String text, int position) { 177 if (((String) convertView.getTag()).equals("button")) { 178 ((Button) convertView).setText(text); 179 convertView.setId(position); 180 return convertView; 181 } else { 182 return null; 183 } 184 } 185 186 /** 187 * Create a text view ready to be a list item. 188 * 189 * @param position The position within the list. 190 * @param context The context. 191 * @param text The text to display 192 * @param desiredHeight The desired height of the text view 193 * @return The created view. 194 */ text(int position, Context context, String text, int desiredHeight)195 public static View text(int position, Context context, String text, int desiredHeight) { 196 TextView result = new TextView(context); 197 result.setHeight(desiredHeight); 198 result.setText(text); 199 final ViewGroup.LayoutParams lp = new AbsListView.LayoutParams( 200 ViewGroup.LayoutParams.MATCH_PARENT, 201 ViewGroup.LayoutParams.WRAP_CONTENT); 202 result.setLayoutParams(lp); 203 result.setId(position); 204 result.setTag("text"); 205 return result; 206 } 207 208 /** 209 * Convert an existing text view to display the data at a new position. 210 * 211 * @param convertView Non-null TextView created by {@link #text} 212 * @param text The text to display 213 * @param position The position withion the list 214 * @return The converted view 215 */ convertText(View convertView, String text, int position)216 public static View convertText(View convertView, String text, int position) { 217 if(convertView.getTag() != null && ((String) convertView.getTag()).equals("text")) { 218 ((TextView) convertView).setText(text); 219 convertView.setId(position); 220 return convertView; 221 222 } else { 223 return null; 224 } 225 } 226 227 /** 228 * Create a text view ready to be a list item. 229 * 230 * @param position The position within the list. 231 * @param context The context. 232 * @param text The text of the button 233 * @param desiredHeight The desired height of the button 234 * @return The created view. 235 */ doubleText(int position, Context context, String text, int desiredHeight)236 public static View doubleText(int position, Context context, String text, int desiredHeight) { 237 final LinearLayout ll = new LinearLayout(context); 238 ll.setOrientation(LinearLayout.HORIZONTAL); 239 240 final AbsListView.LayoutParams lp = 241 new AbsListView.LayoutParams( 242 ViewGroup.LayoutParams.MATCH_PARENT, 243 desiredHeight); 244 ll.setLayoutParams(lp); 245 ll.setId(position); 246 247 TextView t1 = new TextView(context); 248 t1.setHeight(desiredHeight); 249 t1.setText(text); 250 t1.setGravity(Gravity.START | Gravity.CENTER_VERTICAL); 251 final ViewGroup.LayoutParams lp1 = new LinearLayout.LayoutParams( 252 0, 253 ViewGroup.LayoutParams.WRAP_CONTENT, 1.0f); 254 ll.addView(t1, lp1); 255 256 TextView t2 = new TextView(context); 257 t2.setHeight(desiredHeight); 258 t2.setText(text); 259 t2.setGravity(Gravity.RIGHT | Gravity.CENTER_VERTICAL); 260 final ViewGroup.LayoutParams lp2 = new LinearLayout.LayoutParams( 261 0, 262 ViewGroup.LayoutParams.WRAP_CONTENT, 263 1.0f); 264 265 ll.addView(t2, lp2); 266 ll.setTag("double"); 267 return ll; 268 } 269 270 271 /** 272 * Convert an existing button view to display the data at a new position. 273 * 274 * @param convertView Non-null view created by {@link #doubleText} 275 * @param text The text of the button 276 * @param position The position withion the list 277 * @return The converted view 278 */ convertDoubleText(View convertView, String text, int position)279 public static View convertDoubleText(View convertView, String text, int position) { 280 if (((String) convertView.getTag()).equals("double")) { 281 TextView t1 = (TextView) ((LinearLayout) convertView).getChildAt(0); 282 TextView t2 = (TextView) ((LinearLayout) convertView).getChildAt(1); 283 t1.setText(text); 284 t2.setText(text); 285 convertView.setId(position); 286 return convertView; 287 } else { 288 return null; 289 } 290 } 291 } 292