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

来源:互联网 发布:彩虹无人机 知乎 编辑:程序博客网 时间:2024/06/06 02:31
  • 列表视图(ListView)和ListActivity
①直接使用ListView创建
②让Activity继承ListActivity(相当于该activity显示的组件为ListView)

提示:ListView、GridView、Spinner、Galley等AdapterView都只是容器,而Adapter负责提供每个“列表项”组件,AdapterView则负责采用合适的方式显示这些列表项。

AbsListView的常用属性和相关方法见下表:

属性

相关方法

说明

android:choiceMode 

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

singleChoice:允许单选

multipleChoice:允许多选

multipleChoiceModal:允许多选

android:drawSelectorOnTopsetDrawSelectorOnTop(boolean)如果该属性设置为true,选中的列表项将会显示在上面android:fastScrollEnabled 设置是否允许快速滚动。如果该属性设置为true,将会显示滚动图标,并允许用户拖动该滚动图标进行快速滚动。android:listSelectorsetSelector(int)指定被选中的列表项上绘制的Drawableandroid:scrollingCache 如果设置为true,则在滚动时将会使用缓存android:smoothScrollbarsetSmoothScrollbarEnabled(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将根据该数组资源来生成ListViewandroid:footerDividerEnabled如果设置成false,则不在footer View之前绘制分隔条andorid:headerDividerEnabled如果设置成false,则不再header View之前绘制分隔条
  • Adapter接口及实现类

ArrayAdapter(列表项只能是TextView)
①布局文件里:
<ListView
     ...
     android:id="@+id/listview"
     />
②Java段内需要一个数组或者list集合

③//将数组包装为ArrayAdapter
ArrayAdapter<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.java
public 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提供。

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:autoStartstartFlipping()设置显示该组件是否自动播放android:flipIntervalsetFlipInterval(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();
    }
}
0 0
原创粉丝点击