2.5 UI组件-AdapterView及子类(疯狂android学习笔记)

时间:2021-12-09 00:20:24
2.5 UI组件-AdapterView及子类(疯狂android学习笔记)2.5 UI组件-AdapterView及子类(疯狂android学习笔记)
  • 列表视图(ListView)和ListActivity
①直接使用ListView创建 ②让Activity继承ListActivity(相当于该activity显示的组件为ListView)
提示:ListView、GridView、Spinner、Galley等AdapterView都只是容器,而Adapter负责提供每个“列表项”组件,AdapterView则负责采用合适的方式显示这些列表项。
AbsListView的常用属性和相关方法见下表:

属性

相关方法

说明

android:choiceMode  

设置AbsListView的选择方式: 
none:不显示任何选中项

singleChoice:允许单选

multipleChoice:允许多选

multipleChoiceModal:允许多选

android:drawSelectorOnTop setDrawSelectorOnTop(boolean) 如果该属性设置为true,选中的列表项将会显示在上面
android:fastScrollEnabled   设置是否允许快速滚动。如果该属性设置为true,将会显示滚动图标,并允许用户拖动该滚动图标进行快速滚动。
android:listSelector setSelector(int) 指定被选中的列表项上绘制的Drawable
android:scrollingCache   如果设置为true,则在滚动时将会使用缓存
android:smoothScrollbar setSmoothScrollbarEnabled(boolean) 如果设置为false,则不在header View之后绘制分隔条
android:stackFromBottom   设置是否从底端开始排列列表项
android:textFilterEnabled   设置是否对列表项进行过滤。只有当该AdapterView对应的Adapter实现了Filter接口时该属性才会作用。
android:transcriptMode   设置组件的滚动模式: 
disabled:关闭滚动(默认) 
normal:当该AbsListView收到数据改变通知,且最后一个列表项可见时,该AbsListView将会滚动到底端。 alwaysScroll:该AbsListView总会自动滚动到底端

ListView提供的属性如下表:

属性

说明

android:divider 设置List列表项的分隔条(可用颜色分隔,也可用drawable对象分隔)
android:dividerHeiht 设置分隔条的高度
android:entries 指定一个数组资源,Android将根据该数组资源来生成ListView
android:footerDividerEnabled 如果设置成false,则不在footer View之前绘制分隔条
andorid:headerDividerEnabled 如果设置成false,则不再header View之前绘制分隔条
  • Adapter接口及实现类
2.5 UI组件-AdapterView及子类(疯狂android学习笔记)
2.5 UI组件-AdapterView及子类(疯狂android学习笔记) ArrayAdapter(列表项只能是TextView) ①布局文件里:<ListView     ...     android:id="@+id/listview"     />②Java段内需要一个数组或者list集合
③//将数组包装为ArrayAdapterArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.array_item, array);      参数:Context, TextViewResourceId(布局文件,里面包含一个TextView,自己设置显示的格式), 数组或list
ListActivity public class MainActivity extends ListActivity {    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        // 无须使用布局文件 setContentView()        String[] arr = { "孙悟空", "猪八戒", "唐僧" };        // 创建ArrayAdapter对象        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,                android.R.layout.simple_list_item_multiple_choice, arr);        // 设置该窗口显示列表        setListAdapter(adapter); 0000000    }} SimpleAdapter(更复杂的列表项使用SimpleAdapter) public class MainActivity extends Activity {
    private String[] names = new String[]            { "虎头", "弄玉", "李清照", "李白"};    private String[] descs = new String[]            { "可爱的小孩", "一个擅长音乐的女孩"                    , "一个擅长文学的女性", "浪漫主义诗人"};    private int[] imageIds = new int[]            { R.drawable.tiger , R.drawable.nongyu                    , R.drawable.qingzhao , R.drawable.libai};
    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);     //main.xml布局里面有一个ListView项, id=mylist               // 创建一个List集合,List集合的元素是Map        List<Map<String, Object>> listItems =                new ArrayList<Map<String, Object>>();        //添加数据到集合中        for (int i = 0; i < names.length; i++) {            Map<String, Object> listItem = new HashMap<String, Object>();            listItem.put("header", imageIds[i]);            listItem.put("personName", names[i]);            listItem.put("desc", descs[i]);            listItems.add(listItem);        }
        // 创建一个SimpleAdapter        SimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems,                R.layout.simple_item,.                new String[] { "personName", "header" , "desc"},                new int[] { R.id.name, R.id.header , R.id.desc });
参数:     第2个:List<Map<String, Object>>          第3个:simple_item布局里面就是图片和两句文字的具体显示          第4个:String[] 是Map<String, ?>里面的key          第5个:int[]决定填充哪些组件---simple_item布局里面图片和文字对应的id
        ListView mylist = (ListView) findViewById(R.id.mylist);        // 为ListView设置Adapter        mylist.setAdapter(simpleAdapter);
        // 为ListView的列表项的单击事件绑定事件监听器        list.setOnItemClickListener(new OnItemClickListener() {            // 第position项被单击时激发该方法            @Override            public void onItemClick(AdapterView<?> parent, View view,                                    int position, long id) {                System.out.println(names[position]                        + "被单击了");            }        });
        // 为ListView的列表项的选中事件绑定事件监听器        list.setOnItemSelectedListener(new OnItemSelectedListener()        {            // 第position项被选中时激发该方法            @Override            public void onItemSelected(AdapterView<?> parent, View view,                                       int position, long id) {                System.out.println(names[position]                        + "被选中了");            }            @Override            public void onNothingSelected(AdapterView<?> parent) {            }        });    }}
扩展BaseAdapter实现不存储列表项的ListView public class MainActivity extends Activity {    ListView myList;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);       myList = (ListView) findViewById(R.id.myList);     //main.xml中ListView项的ID        BaseAdapteradapter = new BaseAdapter() {            @Override            publicint getCount() {                // 返回值控制该Adapter将会包含多少个列表项
                // 指定一共包含40个选项                return 40;            }
            @Override            publicObject getItem(int position) {                // 返回值决定第position处的列表项的内容
                return null;            }                        @Override            publiclong getItemId(int position) {               // 返回值将作为列表项的ID                return position;            }                       @Override            publicView getView(int position                    , View convertView , ViewGroup parent) {               // 返回的View将作为列表框                LinearLayout line =new LinearLayout(MainActivity.this);                line.setOrientation(0);                ImageView image =new ImageView(MainActivity.this);                image.setImageResource(R.drawable.ic_launcher);                TextView text =new TextView(MainActivity.this);                text.setText("第" + (position +1 ) + "个列表项");                text.setTextSize(20);                text.setTextColor(Color.RED);                line.addView(image);                line.addView(text);                // 返回LinearLayout实例                return line;            }        };        myList.setAdapter(adapter);    }}
  • 自动完成文本框(AutoCompleteTextView)的功能及用法
从EditText派生而出,实际上它也是一个文本编辑框。当用户输入一定字符后,自动完成文本框会显示一个下拉菜单,供用户选择,然后自动填写该文本框。 其还派生出一个子类:MultiAutoCompleteTextView(允许输入多个提示项) main.xml <!-- 定义一个自动完成文本框,        指定输入一个字符后进行提示 -->    <AutoCompleteTextView        android:id="@+id/auto"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:completionHint="请选择您喜欢的图书:"   <!--设置下拉菜单中的提示标题-->        android:dropDownHorizontalOffset="10dp"        <!--下拉菜单与文本框之间的水平偏移-->        android:completionThreshold="1"/>              <!--设置用户至少输入几个字符才会显示提示-->    <!-- 定义一个MultiAutoCompleteTextView组件 -->    <MultiAutoCompleteTextView        android:id="@+id/mauto"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:completionThreshold="1"/> MainActivity.java public class MainActivity extends Activity {    AutoCompleteTextView actv;    MultiAutoCompleteTextView mauto;    // 定义字符串数组,作为提示的文本    String[]books = new String[]{            "疯狂Java讲义",            "疯狂Ajax讲义",            "疯狂XML讲义",            "疯狂Workflow讲义"    };
    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);       // 创建一个ArrayAdapter,封装数组        ArrayAdapter<String> aa = new ArrayAdapter<String>(this,                android.R.layout.simple_dropdown_it em_1line, books);       actv = (AutoCompleteTextView)findViewById(R.id.auto);        // 设置Adapter       actv.setAdapter(aa);       mauto = (MultiAutoCompleteTextView)findViewById(R.id.mauto);        // 设置Adapter       mauto.setAdapter(aa);        // 为MultiAutoCompleteTextView设置分隔符       mauto.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());    }}
  • 网格视图(GridView)的功能及用法

属性名称

描述

android:columnWidth

设置列的宽度。关联的方法为:setColumnWidth(int)

android:gravity

设置此组件中的内容在组件中的位置。可选的值有:top、bottom、left、right、center_vertical、fill_vertical、center_horizontal、fill_horizontal、center、fill、clip_vertical 可以多选,用“|”分开。关联方法:setGravity (int gravity)

android:horizontalSpacing

两列之间的间距。关联方法:setHorizontalSpacing(int)

android:numColumns

列数。关联方法:setNumColumns(int)

android:stretchMode

缩放模式。关联方法:setStretchMode(int)

android:verticalSpacing

两行之间的间距。关联方法:setVerticalSpacing(int)
android:stretchMode支持如下属性值NO_STRETCH不拉伸STRETCH_SPACING仅拉伸元素之间的间距STRETCH_SPACING_UNIFORM表格元素本身、元素之间的间距一起拉伸STRETCH_COLUMN_WIDTH仅拉伸表格元素本身main.xml<!-- 定义一个GridView组件 -->    <GridView        android:id="@+id/grid01"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:horizontalSpacing="1pt"          android:verticalSpacing="1pt"        android:numColumns="4"        android:gravity="center"/>    <!-- 定义一个ImageView组件 -->    <ImageView android:id="@+id/imageView"        android:layout_width="240dp"        android:layout_height="240dp"        android:layout_gravity="center_horizontal"/>MainActivity.javapublic class MainActivity extends Activity {    GridView grid;    ImageView imageView;
    int[]imageIds = new int[] {        R.drawable.bomb5 , R.drawable.bomb6 , R.drawable.bomb7        , R.drawable.bomb8 , R.drawable.bomb9 , R.drawable.bomb10        , R.drawable.bomb11 , R.drawable.bomb12    , R.drawable.bomb13        , R.drawable.bomb14 , R.drawable.bomb15 , R.drawable.bomb16    };
    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);       // 创建一个List对象,List对象的元素是Map        List<Map<String, Object>> listItems=                new ArrayList<Map<String, Object>>();        for (int i = 0; i < imageIds.length; i++) {            Map<String, Object> listItem = new HashMap<String, Object>();            listItem.put("image", imageIds[i]);           listItems.add(listItem);        }        // 获取显示图片的ImageView        imageView = (ImageView) findViewById(R.id.imageView);       // 创建一个SimpleAdapter        SimpleAdapter simpleAdapter= new SimpleAdapter(this,                listItems                // 使用/layout/cell.xml文件作为界面布局  <!--cell里面一个ImageView的图片-->                , R.layout.cell, new String[] { "image" },                new int[] { R.id.image1 });        grid = (GridView) findViewById(R.id.grid01);        // 为GridView设置Adapter       grid.setAdapter(simpleAdapter);        // 添加列表项被选中的监听器        grid.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {            @Override            public void onItemSelected(AdapterView<?> parent, View view,                int position, long id) {                // 显示当前被选中的图片                imageView.setImageResource(imageIds[position]);            }            @Override            public void onNothingSelected(AdapterView<?> parent) {            }        });        // 添加列表项被单击的监听器        grid.setOnItemClickListener(new AdapterView.OnItemClickListener() {            @Override            public void onItemClick(AdapterView<?> parent, View view,                                    int position, long id) {                // 显示被单击的图片                imageView.setImageResource(imageIds[position]);            }        });    }}
  • 可展开的列表组件(ExpandableListView)
把应用中的列表项分为几组,每组里又可包含多个列表项。列表项由ExpandableListAdapter提供。 2.5 UI组件-AdapterView及子类(疯狂android学习笔记)
2.5 UI组件-AdapterView及子类(疯狂android学习笔记) public class MainActivity extends Activity {    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        //创建一个BaseExpandableListAdapter对象        ExpandableListAdapter adapter =new BaseExpandableListAdapter() {            int[]logos = new int[] {                R.drawable.p,                R.drawable.z,                R.drawable.t            };            private String[]armTypes = new String[]                { "神族兵种", "虫族兵种", "人族兵种"};            private String[][]arms = new String[][]                {                    { "狂战士", "龙骑士", "黑暗圣堂", "电兵" },                    { "小狗", "刺蛇", "飞龙", "自爆飞机" },                    { "机枪兵", "护士MM" , "幽灵" }                };                        @Override            public ObjectgetChild(int groupPosition, int childPosition) {                // 获取指定组位置、指定子列表项处的子列表项数据                return arms[groupPosition][childPosition];            }            @Override            public longgetChildId(int groupPosition, int childPosition) {                return childPosition;            }            @Override            public intgetChildrenCount(int groupPosition) {                // 特定组所包含的子列表项的数量                return arms[groupPosition].length;            }
            private TextViewgetTextView() {                AbsListView.LayoutParams lp = new AbsListView.LayoutParams(                        ViewGroup.LayoutParams.MATCH_PARENT, 64);                TextView textView = new TextView(MainActivity.this);                textView.setLayoutParams(lp);                textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);                textView.setPadding(36, 0, 0, 0);                textView.setTextSize(20);                return textView;            }                        @Override            public ViewgetChildView(int groupPosition, int childPosition,                boolean isLastChild, View convertView, ViewGroup parent) {                // 该方法决定每个子选项的外观                TextView textView = getTextView();                textView.setText(getChild(groupPosition, childPosition)                        .toString());                return textView;            }                        @Override            public ObjectgetGroup(int groupPosition) {                // 获取指定组位置处的组数据                return armTypes[groupPosition];            }            @Override            public intgetGroupCount() {                // 返回包含的组列表项的数量                return armTypes.length;            }            @Override            public longgetGroupId(int groupPosition) {                return groupPosition;            }            // 该方法决定每个组选项的外观            @Override            public ViewgetGroupView(int groupPosition, boolean isExpanded,                                     View convertView, ViewGroup parent) {                // 返回的View对象将作为组列表项                LinearLayout ll = new LinearLayout(MainActivity.this);                ll.setOrientation(0);                ImageView logo = new ImageView(MainActivity.this);                logo.setImageResource(logos[groupPosition]);                ll.addView(logo);                TextView textView = getTextView();                textView.setText(getGroup(groupPosition).toString());                ll.addView(textView);                return ll;            }            @Override            public booleanisChildSelectable(int groupPosition,                                             int childPosition) {                return true;            }            @Override            public booleanhasStableIds() {                return true;            }        };        ExpandableListView expandListView = (ExpandableListView) findViewById(R.id.list);       expandListView.setAdapter(adapter);    }}
  • Spinner的功能及用法
列表选择框(相当于弹出一个菜单供用户选择) // 建立Adapter并且绑定数据源、mItems数组资源ArrayAdapter<String> _Adapter=new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, mItems);//绑定 Adapter到控件mSpinner.setAdapter(_Adapter);//Spinner在布局文件中声明
  • AdapterViewFlipper的功能及用法
会显示Adapter提供的多个View组件,但它每次只能显示一个View组件,程序可通过showPrevious()和showNext()方法控制该组件显示上一个、下一个组件。 在切换过程中可以使用渐隐渐显的动画效果。还可以调用startFlipping()控制它“自动播放”下一个View组件。 AdapterViewAnimator支持的属性:
xml属性 说明
android:animateFirstView 设置显示该组件的第一个view时是否使用动画
android:inAnimation 设置组件显示时使用的动画
android:loopViews 设置循环到最后一个组件后是否自动“转头”到第一个组件
android:outAnimation   设置组件隐藏时使用的动画
AdapterViewFlipper支持的xml属性及相关方法:
xml属性 相关方法 说明
android:autoStart startFlipping() 设置显示该组件是否自动播放
android:flipInterval setFlipInterval(int) 设置自动播放的时间间隔
自动播放图片 布局:     <AdapterViewFlipper        android:id="@+id/flipper"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:flipInterval="5000"        android:layout_alignParentTop="true"/>    <Button        ...        android:onClick="prev"        android:text="上一个"/>    <Button        ...        android:onClick="next"        android:text="下一个"/>    <Button        ...        android:onClick="auto"        android:text="自动播放"/> 代码: public class MainActivity extends Activity {
    int[]imageIds = new int[] {        R.drawable.shuangzi, R.drawable.shuangyu,        R.drawable.chunv, R.drawable.tiancheng, R.drawable.tianxie,        R.drawable.sheshou, R.drawable.juxie, R.drawable.shuiping,        R.drawable.shizi, R.drawable.baiyang, R.drawable.jinniu,        R.drawable.mojie };
    private AdapterViewFlipper flipper;
    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);
       flipper = (AdapterViewFlipper) findViewById(R.id.flipper);
        // 创建一个BaseAdapter对象,该对象负责提供Gallery所显示的列表项        BaseAdapteradapter = new BaseAdapter() {            @Override            public int getCount() {                return imageIds.length;            }            @Override            public Object getItem(int position) {                return null;            }            @Override            public long getItemId(int position) {                return position;            }            // 该方法返回的View代表了每个列表项            @Override            public ViewgetView(int position, View convertView, ViewGroup parent) {                // 创建一个ImageView                ImageView imageView = newImageView(MainActivity.this);                imageView.setImageResource(imageIds[position]);                // 设置ImageView的缩放类型                imageView.setScaleType(ImageView.ScaleType.FIT_XY);                // 为imageView设置布局参数               imageView.setLayoutParams(new ViewGroup.LayoutParams(                        LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));               return imageView;            }        };       flipper.setAdapter(adapter);    }    public voidprev(View source) {        // 显示上一个组件        flipper.showPrevious();        // 停止自动播放        flipper.stopFlipping();    }    public voidnext(View source) {        // 显示下一个组件。        flipper.showNext();        // 停止自动播放        flipper.stopFlipping();    }    public voidauto(View source) {        // 开始自动播放        flipper.startFlipping();    }}
  • StackView的功能及用法
以“堆叠”的方式来显示多个列表项,为了控制StackView显示的view组件,StackView提供了如下两种控制方式: ①拖走StackView中处于顶端的View,下一个View将会显示出来。将上一个View拖进StackView,将使之显示出来 ②通过调用StackView的showNext()、showPrevious()控制显示下一个、上一个组件 叠在一起的图片 布局main.xml <LinearLayout    xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="horizontal"    android:layout_width="match_parent"    android:layout_height="match_parent">    <StackView        android:id="@+id/mStackView"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:loopViews="true" />    <LinearLayout        android:orientation="horizontal"        android:layout_width="wrap_content"        android:layout_height="wrap_content">        <Button            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="上一个"            android:onClick="prev"/>        <Button            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="下一个"            android:onClick="next"/>    </LinearLayout></LinearLayout>
另外cell布局里只是一个ImageView内容
代码 public class MainActivity extends Activity {    StackView stackView;    int[] imageIds = new int[] {        R.drawable.bomb5 , R.drawable.bomb6 , R.drawable.bomb7        , R.drawable.bomb8 , R.drawable.bomb9 , R.drawable.bomb10        , R.drawable.bomb11 , R.drawable.bomb12    , R.drawable.bomb13        , R.drawable.bomb14 , R.drawable.bomb15 , R.drawable.bomb16    };    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);
        stackView = (StackView) findViewById(R.id.mStackView);
        // 创建一个List对象,List对象的元素是Map        List<Map<String, Object>> listItems =                new ArrayList<Map<String, Object>>();
        for (int i = 0; i < imageIds.length; i++) {            Map<String, Object> listItem = new HashMap<String, Object>();            listItem.put("image", imageIds[i]);            listItems.add(listItem);        }
        // 创建一个SimpleAdapter        SimpleAdapter simpleAdapter = new SimpleAdapter(this,                listItems                // 使用/layout/cell.xml文件作为界面布局                , R.layout.cell, new String[] { "image" },                new int[] { R.id.image1 });        stackView.setAdapter(simpleAdapter);    }    public void prev(View view) {        // 显示上一个组件        stackView.showPrevious();    }    public void next(View view) {        // 显示下一个组件        stackView.showNext();    }}