UI组件-AdapterView及其子类

前言

只要自己变优秀了,其他的事情才会跟着好起来。

ListView组件

ListView是手机系统中使用非常广泛的一种组件,它以垂直列表的形式显示所有列表项。接下来介绍几种创建ListView的方法。
代码示例
使用数组创建ListView
listview.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <!-- 直接使用数组资源给出列表项 -->
    <!-- 设置使用红色的分隔条 -->
    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:entries="@array/books"
        android:divider="#f00"
        android:dividerHeight="2px"
        />
</LinearLayout>

arrays.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="books">
        <item>西游记</item>
        <item>水浒传</item>
        <item>三国演义</item>
        <item>红楼梦</item>
    </string-array>
</resources>

使用ArrayAdapter创建ListView
listview2.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <!-- 设置红色分隔条 -->
    <ListView
        android:id="@+id/list1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:divider="#f00"
        android:dividerHeight="2px"
        />
    <!-- 设置绿色分隔条 -->
    <ListView
        android:id="@+id/list2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:divider="#0f0"
        android:dividerHeight="2px"
        />
</LinearLayout>
array_item.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/textView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textSize="24dp"
    android:padding="10px"
    android:shadowColor="#f0f"
    android:shadowDx="4"
    android:shadowDy="4"
    android:shadowRadius="2"/>
MainActivity.java
public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listview2);

        ListView list1 = (ListView) findViewById(R.id.list1);
        //定义一个数组
        String []books = new String[] {"三国演义","红楼梦","西游记","水浒传"};
        //将数组包装为ArrayAdapter
        ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(this, R.layout.array_item, books);
        //为ListView设置Adapter
        list1.setAdapter(adapter1);

        ListView list2 = (ListView) findViewById(R.id.list2);
        //定义一个数组
        String []names = new String[] {"孙悟空","猪八戒","沙和尚","唐僧"};
        //将数组包装为ArrayAdapter
        ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(this, R.layout.array_item, names);
        //为ListView设置Adapter
        list2.setAdapter(adapter2);
    }
}

使用SimpleAdapter创建ListView
listview3.xml、
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <!-- 定义一个ListView -->
    <ListView
        android:id="@+id/mylist"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />
</LinearLayout>

simple_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >
    <!-- 定义一个ImageView,作为列表项的一部分 -->
    <ImageView
        android:id="@+id/header"
        android:scaleType="fitXY"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:paddingLeft="10dp"
        />
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >
        <!-- 定义一个TextView,作为列表项的一部分 -->
        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="20dp"
            android:textColor="#f0f"
            android:paddingLeft="10dp"
            />
         <!-- 定义一个TextView,作为列表项的一部分 -->
         <TextView
            android:id="@+id/desc"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="14dp"
            android:paddingLeft="10dp"
            />
    </LinearLayout>
</LinearLayout>
MainActivity.java
public class MainActivity extends Activity {

    private String[] names = new String[]
            {"考拉","郁金香","企鹅","水母"};

    private String[] descs = new String[]
            {"一种可爱的动物","一种美丽的花朵","一种生活在南极的动物","一种生活在海里的神奇生物"};
    private int[] imageIds = new int[]
            {R.drawable.kaola,R.drawable.yujinx,R.drawable.qie,R.drawable.shuimo};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listview3);
        //创建一个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("name", names[i]);
            listItem.put("desc", descs[i]);
            listItems.add(listItem);
        }
        //创建一个SimpleAdapter
        SimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems, R.layout.simple_item,
                new String[] {"name","header","desc"},
                new int[] {R.id.name,R.id.header,R.id.desc});

        ListView list = (ListView) findViewById(R.id.mylist);
        //为ListView设置Adapter
        list.setAdapter(simpleAdapter);
    }
}


使用BaseAdapter创建ListView
listview4.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <ListView
        android:id="@+id/myList"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />
</LinearLayout>

MainActivity.java
public class MainActivity extends Activity {
    ListView myList;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listview4);

        myList = (ListView) findViewById(R.id.myList);
        BaseAdapter adapter = new BaseAdapter() {

            //重写该方法,该方法返回的View将作为列表框
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                //创建一个LinearLayout,并向其中添加两个组件
                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);
                return line;
            }

            @Override
            public long getItemId(int position) {
                return position;
            }

            @Override
            public Object getItem(int position) {
                return null;
            }

            @Override
            public int getCount() {
                //指定一共包含40个列表项
                return 40;
            }
        };
        myList.setAdapter(adapter);
    }
}

基于ListActivity实现列表
listactivity.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tv"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    />

MainActivity.java
public class MainActivity extends ListActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //无需使用布局文件
        String[] names = {"西游记","红楼梦","三国演义","水浒传"};
        //创建ArrayAdapter对象
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.listactivity, names);
        //设置该窗口显示列表
        setListAdapter(adapter);
    }
}

效果
使用数组创建的ListView

img_f25d5d702a516e6dd1df7274c1e3d7e0.png
Screenshot_1508382099.png
使用ArrayAdapter创建的ListView

img_9b3f421129f6ce48d5039efe04f3b0d3.png
Screenshot_1508383040.png
使用SimpleAdapter创建的ListView

img_684b54ad5fd67c4228d5243c6c886304.png
Screenshot_1508388930.png
使用BaseAdapter创建的ListView

img_c4422613b325cdac7b8baa4e5078c381.png
Screenshot_1508389647.png
基于ListActivity实现的列表

img_c842067e90f280a52b16c7ed63578099.png
Screenshot_1508390424.png
提示
当列表项很多时,为了防止内存溢出,可以使用ListView的andriod:scrollingCache属性来绘制缓冲,同时还有别的方法。以后将会介绍。
下面我来说说上述几个Adapter的区别。
  • ArrayAdapter:简单、易用的Adapter,通常用于将数组或List集合的多个值包装成多个列表项。

  • SimpleAdapter:并不简单、功能强大的Adapter,可用于将List集合的多个对象包装成多个列表项。

  • BaseAdapter:通常用于被扩展。扩展BaseAdapter可以对各列表项进行最大限度的定制。我比较喜欢用这个Adapter,使用这个Adapter需要重写如下四个方法。

    1. getCount():该方法的返回值控制该Adapter将会包含多少个列表项。

    2. getItem(int position):该方法的返回值决定第position处的列表项的内容。

    3. getItemId(int position):该方法的返回值决定第position处的列表项的ID。

    4. getView(int position,View convertView,ViewGroup parent):该方法的返回值决定第position处的列表项组件。

其中最重要的第1个和第4个方法。

AutoCompleteTextView组件

自动完成文本框(AutoCompeletTextView)从EditText派生而出,实际上它也是一个文本编辑框,但它比普通编辑框多了一个功能:当用户输入一定的字符之后,自动完成文本框会显示一个下拉菜单,供用户选择,当用户选择某个菜单项之后,AutoCompleteTextView按用户选择自动填写该文本框。
代码示例
autocompletetextview.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <!-- 定义一个自动完成文本框,指定输入一个字符后进行提示 -->
    <AutoCompleteTextView
        android:id="@+id/auto"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:completionHint="请选择您喜欢的图书"
        android:completionThreshold="1"
        />
    <!-- 定义一个MultiAutoCompleteTextView组件 -->
    <MultiAutoCompleteTextView
        android:id="@+id/mauto"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:completionThreshold="1"
        />
</LinearLayout>
MainActivity.java
public class MainActivity extends Activity {
    AutoCompleteTextView actv;
    MultiAutoCompleteTextView mauto;
    //定义字符串数组,作为提示文本
    String[] books = new String[] {
            "西游记",
            "水浒传",
            "三国演义",
            "水浒传"
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.autocompletetextview);
        //创建一个ArrayAdapter,封装数组
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, books);
        actv = (AutoCompleteTextView) findViewById(R.id.auto);
        //设置Adapter
        actv.setAdapter(adapter);
        mauto = (MultiAutoCompleteTextView) findViewById(R.id.mauto);
        //设置Adapter
        mauto.setAdapter(adapter);
        //为MultiAutoCompleteTextView设置分隔符
        mauto.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());
    }
}
效果
img_92b9f7782b3468e50e70cfb0d5bbd32e.png
Screenshot_1508393517.png
提示
AutoCompleteTextView与MultiAutoCompleteTextView的区别在于MultiAutoCompleteTextView允许输入多个提示项,多个提示项以分隔符分隔。
android:comletionThreshold属性,设置用户至少输入几个字符才会显示提示。

GridView组件

网格视图(GridView)和ListView有共同的父类,它们的唯一区别在于ListView只显示一列,而GridView可以显示多列。另外,ListView相当于一种特殊的GridView,如果GridView只显示一列,那么该GridView就变成了ListView。
与ListView类似的是,GridView也需要Adapter来提供显示的诗数据,可以通过ArrayAdapter、SimpleAdapter、BaseAdapter来创建Adapter,用法基本一致。
代码示例
gridview.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center_horizontal"
    >
    <!-- 定义一个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="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="2dp"
        android:layout_gravity="center_horizontal"
        />
</LinearLayout>
cell.xml
<?xml version="1.0" encoding="utf-8"?>
<ImageView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/image1"
    android:layout_width="70dp"
    android:layout_height="70dp"
    />

MainActivity.java
public class MainActivity extends Activity {

    GridView grid;
    ImageView imageView;
    int[] imageIds = new int[]
            {
                R.drawable.baxianhua,R.drawable.dengta,R.drawable.ic_launcher,R.drawable.juhua,
                R.drawable.kaola,R.drawable.shamo,R.drawable.shuimo,R.drawable.yujinx,
                R.drawable.qie,R.drawable.shamo,R.drawable.shuimo,R.drawable.yujinx,
                R.drawable.baxianhua,R.drawable.dengta,R.drawable.ic_launcher,R.drawable.juhua
            };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.gridview);

        //创建一个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, 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 onNothingSelected(AdapterView<?> parent) {
            }

            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                //显示当前被选中的图片
                imageView.setImageResource(imageIds[position]);
            }
        });

        //添加列表项被单击的监听器
        grid.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                //显示背单击的图片
                imageView.setImageResource(imageIds[position]);
            }
        });
    }
}
效果
img_077842ee9ac864f975770687beb3d0c4.png
Screenshot_1508398206.png
提示
android:numColumns属性,设置列数。
android:horizontalSpacing属性,设置个元素之间的水平间距。
android:verticalSpacing属性,设置个元素之间的垂直间距。

ExpandableListView组件

可展开的列表组件(ExpandableListView)是ListView的子类,它在普通ListView的基础上进行了扩展,它把应用中的列表项分为几组,每组里又可包含多个列表项。
ExpandableListView所显示的列表项由ExpandableListAdapter提供。实现ExpandableListAdapter的方式有如下三种。
  • 扩展BaseExpandableListAdapter实现ExpandableListAdapter。

  • 使用SimpleExpandableListAdapter将两个List集合包装成ExpandableListAdapter。

  • 使用SimpleCursorTreeAdapter将Cursor中的数据包装成SimpleCursorTreeAdapter。

代码示例
expandablelistview.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <ExpandableListView
        android:id="@+id/list"
        android:childDivider="#f00"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />
</LinearLayout>

MainActivity.java
public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.expandablelistview);
        //创建一个ExpandableListAdapter对象
        ExpandableListAdapter adapter = new BaseExpandableListAdapter() {

            int[] logos = new int[]
            {
                R.drawable.kaola,
                R.drawable.qie,
                R.drawable.shuimo
            };

            private String[] armTypes = new String[]
            {"考拉","企鹅","水母"};
            private String[][] arms = new String[][]
            {
                {"白考拉","红考拉","黑考拉"},
                {"白企鹅","帝企鹅","黑企鹅"},
                {"白水母","毒水母","黑水母"}
            };

            @Override
            public boolean isChildSelectable(int groupPosition, int childPosition) {
                return true;
            }

            @Override
            public boolean hasStableIds() {
                return true;
            }

            //该方法决定每个组选项的外观
            @Override
            public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
                LinearLayout ll = new LinearLayout(MainActivity.this);
                ll.setOrientation(0);
                ImageView logo = new ImageView(MainActivity.this);
                logo.setImageResource(logos[groupPosition]);
                logo.setLayoutParams(new LinearLayout.LayoutParams(100, 100));
                ll.addView(logo);
                TextView textView = new TextView(MainActivity.this);
                textView.setText(getGroup(groupPosition).toString());
                textView.setTextSize(20);
                ll.addView(textView);
                return ll;
            }

            @Override
            public long getGroupId(int groupPosition) {
                return groupPosition;
            }

            @Override
            public int getGroupCount() {
                return armTypes.length;
            }

            //获取指定组位置处的组数据
            @Override
            public Object getGroup(int groupPosition) {
                return armTypes[groupPosition];
            }

            @Override
            public int getChildrenCount(int groupPosition) {
                return arms[groupPosition].length;
            }

            private TextView geTextView()
            {
                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 View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView,
                    ViewGroup parent) {
                TextView textView = geTextView();
                textView.setText(getChild(groupPosition, childPosition).toString());
                return textView;
            }

            @Override
            public long getChildId(int groupPosition, int childPosition) {
                return childPosition;
            }

            //获取指定组位置、指定子列表项处的子列表项数据
            @Override
            public Object getChild(int groupPosition, int childPosition) {
                return arms[groupPosition][childPosition];
            }
        };
        ExpandableListView expandListView = (ExpandableListView) findViewById(R.id.list);
        expandListView.setAdapter(adapter);
    }
}
效果
img_b89d8b2354592a05073a184a02bf71ae.png
Screenshot_20171020-093318.png
提示
上面使用BaseExpandableListAdapter来实现ExpandableListAdapter,当扩展BaseExpandableListAdapter时,关键是实现如下4个方法。
  • getGroupCount():该方法返回包含的组列表项的数量。

  • getGroupView():该方法返回的View对象将作为组列表项。

  • getChildrenCount():该方法返回特定组所包含的子列表项的数量。

  • getChildView():该方法返回的View对象将作为特定组,特定位置的子列表项。


Spinner组件

Spinner其实就是一个列表选择框,不过不是显示下拉列表,而是弹出一个菜单供用户选择。如果已经确定了Spinner的列表项,只要为Spinner指定android:entries属性即可;如果不确定列表项,需要在程序运行时动态决定Spinner的列表项,则需要用Adapter来为Spinner提供列表项。
代码示例
spinner.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <!-- 定义一个Spinner组件,指定显示该Spinner组件的数组 -->
    <Spinner
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:entries="@array/books"
        />
    <Spinner
        android:id="@+id/spinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />
</LinearLayout>
MainActivity.java
public class MainActivity extends Activity {
    Spinner spinner;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.spinner);
        //获取界面布局文件中的Spinner
        spinner = (Spinner) findViewById(R.id.spinner);
        String []arr = {"西游记","红楼梦","三国演义","水浒传"};
        //创建ArrayAdapter对象
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_multiple_choice,arr);
        //为Spinner设置Adapter
        spinner.setAdapter(adapter);
    }
}
效果
img_06f44526d5223ab620825d4ca1f16390.png
Screenshot_20171020-100344.png
提示
第一个Spinner组件指定了android:entries属性,第二个Spinner组件没有指定android:entries属性,因此需要在Activity中为它设置Adapter。

AdapterViewFlipper组件

AdapterViewFlipper继承了AdapterViewAnimator,它也会显示Adapter提供的多个View组件,但它每次只能显示一个View组件,程序可通过showPrevious()和showNext()方法控制该组件显示上一个、下一个组件。它还有自动播放的功能。
代码示例
adapterviewanimator.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <AdapterViewFlipper
        android:id="@+id/flipper"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:flipInterval="5000"
        android:layout_alignParentTop="true"
        />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentBottom="true"
        android:onClick="prev"
        android:text="上一个"
        />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:onClick="next"
        android:text="下一个"
        />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentBottom="true"
        android:onClick="auto"
        android:text="自动播放"
        />
</RelativeLayout>

MainAvtivity.java
public class MainActivity extends Activity {

    int[] imageIds = new int[]
    {
        R.drawable.baxianhua,R.drawable.dengta,R.drawable.juhua,
        R.drawable.kaola,R.drawable.qie,R.drawable.shamo,R.drawable.shuimo,
        R.drawable.yujinx
    };
    private AdapterViewFlipper flipper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.adapterviewanimator);
        flipper = (AdapterViewFlipper) findViewById(R.id.flipper);
        //创建一个BaseAdapter对象
        BaseAdapter adapter = new BaseAdapter() {

            @Override
            public View getView(int position, View convertView, ViewGroup parent) {

                //创建一个ImageView
                ImageView imageView = new ImageView(MainActivity.this);
                imageView.setImageResource(imageIds[position]);
                //设置ImageView的缩放类型
                imageView.setScaleType(ScaleType.FIT_XY);
                //为ImageView设置布局参数
                imageView.setLayoutParams(new ViewGroup.LayoutParams(
                        LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT
                        ));
                return imageView;
            }

            @Override
            public long getItemId(int position) {
                return position;
            }

            @Override
            public Object getItem(int position) {
                return imageIds[position];
            }

            @Override
            public int getCount() {
                return imageIds.length;
            }
        };
        flipper.setAdapter(adapter);
    }

    public void prev(View view) {
        //显示上一个组件
        flipper.showPrevious();
        //停止自动播放
        flipper.stopFlipping();
    }

    public void next(View view) {
        //显示上一个组件
        flipper.showNext();
        //停止自动播放
        flipper.stopFlipping();
    }

    public void auto(View view) {
        //开始自动播放
        flipper.startFlipping();
    }
}

效果
img_555fde859f0917ca7f5cc85cb52247cc.png
Screenshot_20171020-103243.png
提示
android:animateFirstView属性,设置显示该组件的第一个View时是否使用动画。
android:inAnimation属性,设置组件显示时使用的动画。
android:loopViews属性,设置循环播放。
android:autoStart属性,设置是否自动播放。
android:flipInterval属性,设置自动播放的时间间隔。

StackView组件

StackView也是AdapterViewAnimator的子类,它用于显示Adapter提供的一系列View。StackView将会以“堆叠”的方式来显示多个列表项。
代码示例
stackview.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >
    <StackView
        android:id="@+id/stackview"
        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>

MainActivity.java
public class MainActivity extends Activity {

    private StackView stackView;

    int[] imageIds = new int[]
    {
        R.drawable.baxianhua,R.drawable.dengta,R.drawable.juhua,
        R.drawable.kaola,R.drawable.qie,R.drawable.shamo,R.drawable.shuimo,
        R.drawable.yujinx
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.stackview);
        stackView = (StackView) findViewById(R.id.stackview);
        //创建一个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, 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();
    }
}
效果
img_f98218a33c987a9b6014331fa1e15c32.png
Screenshot_20171020-110029.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值