Выбрать главу

  "etiam", "vel", "erat", "placerat", "ante",

  "porttitor", "sodales", "pellentesque", "augue", "purus"};

 @Override

 public void onCreate(Bundle icicle) {

  super.onCreate(icicle);

  setContentView(R.layout.main);

  selection = (TextView)findViewById(R.id.selection);

  GridView g=(GridView)findViewById(R.id.grid);

  g.setAdapter(new FunnyLookingAdapter(this,

   android.R.layout.simple_list_item_1, items));

  g.setOnItemSelectedListener(this);

 }

 public void onItemSelected(AdapterView<?> parent, View v,

  int position, long id) {

  selection.setText(items[position]);

 }

 public void onNothingSelected(AdapterView<?> parent) {

  selection.setText("");

 }

 private class FunnyLookingAdapter extends ArrayAdapter {

  Context ctxt;

  FunnyLookingAdapter(Context ctxt, int resource,

   String[] items) {

   super(ctxt, resource, items);

   this.ctxt = ctxt;

  }

  public View getView(int position, View convertView,

   ViewGroup parent) {

   TextView label = (TextView)convertView;

   if (convertView==null) {

    convertView = new TextView(ctxt);

    label = (TextView)convertView;

   }

   label.setText(items[position]);

   return(convertView);

  }

 }

}

For the grid cells, rather than using auto-generated TextView widgets as in the previous sections, we create our own views, by subclassing ArrayAdapter and overriding getView(). In this case, we wrap the funny-looking strings in our own TextView widgets, just to be different. If getView() receives a TextView, we just reset its text; otherwise, we create a new TextView instance and populate it.

With the 35-pixel vertical spacing from the XML layout (android:verticalSpacing="35"), the grid overflows the boundaries of the emulator’s screen as shown in Figures 8-4 and 8-5.

Figure 8-4. The GridDemo sample application, as initially launched

Figure 8-5. The same application, scrolled to the bottom of the grid

Fields: Now with 35% Less Typing!

The AutoCompleteTextView is sort of a hybrid between the EditText (field) and the Spinner. With auto-completion, as the user types, the text is treated as a prefix filter, comparing the entered text as a prefix against a list of candidates. Matches are shown in a selection list that, like with Spinner, folds down from the field. The user can either type out an entry (e.g., something not in the list) or choose an entry from the list to be the value of the field.

AutoCompleteTextView subclasses EditText, so you can configure all the standard look-and-feel aspects, such as font face and color.

In addition, AutoCompleteTextView has a android:completionThreshold property, to indicate the minimum number of characters a user must enter before the list filtering begins.

You can give AutoCompleteTextView an adapter containing the list of candidate values via setAdapter(). However, since the user could type something not in the list, AutoCompleteTextView does not support selection listeners. Instead, you can register a TextWatcher, like you can with any EditText, to be notified when the text changes. These events will occur either because of manual typing or from a selection from the drop-down list.

The following is a familiar-looking XML layout, this time containing an AutoCompleteTextView (pulled from the Selection/AutoComplete sample application):

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout

 xmlns:android="http://schemas.android.com/apk/res/android"

 android:orientation="vertical"

 android:layout_width="fill_parent"

 android:layout_height="fill_parent">

 <TextView

  android:id="@+id/selection"

  android:layout_width="fill_parent"

  android:layout_height="wrap_content"

 />

 <AutoCompleteTextView android:id="@+id/edit"

  android:layout_width="fill_parent"

  android:layout_height="wrap_content"

  android:completionThreshold="3"/>

</LinearLayout>

The corresponding Java code is:

public class AutoCompleteDemo extends Activity

 implements TextWatcher {

 TextView selection;

 AutoCompleteTextView edit;

 String[] items={"lorem", "ipsum", "dolor", "sit", "amet",

  "consectetuer", "adipiscing", "elit", "morbi", "vel",

  "ligula", "vitae", "arcu", "aliquet", "mollis",

  "etiam", "vel", "erat", "placerat", "ante",

  "porttitor", "sodales", "pellentesque", "augue", "purus"};

 @Override

 public void onCreate(Bundle icicle) {

  super.onCreate(icicle);

  setContentView(R.layout.main);

  selection = (TextView)findViewById(R.id.selection);

  edit = (AutoCompleteTextView)findViewById(R.id.edit);

  edit.addTextChangedListener(this);

  edit.setAdapter(new ArrayAdapter<String>(this,

   android.R.layout.simple_dropdown_item_1line, items));

 }

 public void onTextChanged(CharSequence s, int start, int before,