2014-2-13AdapterView及其子类3

本文深入探讨了Android中常用的四个列表控件:Spinner、Gallery、AdapterViewFlipper与StackView的用法与实现细节。包括它们的功能介绍、实例代码演示以及常见问题解决方法。
摘要由CSDN通过智能技术生成

1.   Spinner的功能与用法

Spinner是一个列表选择框(弹出一个菜单供用户选择)

Spinner和Galley都继承于AbsSpinner,AbsSpinner继承于AdapterView,所以它也表现出AdapterView的特征:只要为AdapterView提供Adapter即可。

如果开发者使用Spinner时已经可以确定下拉列表框里的列表项,则直接指定android:entries属性即可;如果程序需要在运行时动态决定Spinner的列表项,则需要使用Adapter为Spinner提供列表项

实例:

在界面布局文件下线性布局两个Spinner组件:

<Spinner
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:entries="@array/books"
        android:prompt="@string/tip"
        />
    <Spinner
        android:id="@+id/spinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:prompt="@string/tip"
    />

       第一个Spinner使用@array/books指定数组资源需在res/valus目录下使用xml文件定义:

<?xml version="1.0"encoding="utf-8"?>
<resources>
    <string-array name = "books">
        <item>如何阅读一本书</item>
        <item>拆掉思维的墙</item>
        <item>做最好的自己</item>
    </string-array>   
</resources>

       第二个Spinner需在Activity中采用ArrayAdapter提供列表项:

public class SpinnerText extends Activity {
 
    Spinner spinner;
    @Override
    protected voidonCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.spinner_text);
       //获取布局文件中的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);
    }
}

效果:

2.画廊视图(Gallery)的功能和用法

       Gallery的父类也是:AbsSpinner,也是一个列表框,Gallery显示的是一个水平的列表选择框,允许用户通过拖动来查看上一个、下一个列表项。

实例:

界面布局线性ImageView组件和Gallery组件:

    <!-- 定义一个ImageView组件 -->
    <ImageView android:id="@+id/imageView"
        android:layout_width="320dp"
        android:layout_height="320dp"
        />
    <!-- 定义一个Gallery组件 -->
    <Gallery android:id="@+id/gallery"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="25dp"
        android:unselectedAlpha="0.6"
        android:spacing="2pt"
        />


Activity代码添加一个Adapter对象,并绑定OnItemSelectedListener监听器,目的让ImageView显示Gallery选中的图片:

BaseAdapteradapter = new BaseAdapter()
       {
 
           @Override
           public int getCount() {
              return imageIds.length;
           }
 
           @Override
           public Object getItem(int position) {
              return position;
           }
 
           @Override
           public long getItemId(int position) {
              return position;
           }
           //该方法返回的View代表了每个列表项
           @Override
           public View getView(int position, View convertView, ViewGroupparent) {
              //创建一个ImageView
              ImageView imageView = new ImageView(GalleryText.this);
              imageView.setImageResource(imageIds[position]);
              //设置ImageView的缩放类型
              imageView.setScaleType(ImageView.ScaleType.FIT_XY);
              //为imageView设置布局参数
              imageView.setLayoutParams(new Gallery.LayoutParams(75,100));
              TypedArray typedArray =obtainStyledAttributes(R.styleable.Gallery);
              imageView.setBackgroundResource(typedArray.getResourceId(
                     R.styleable.Gallery_android_galleryItemBackground, 0));
              return imageView;
           }
       };
       gallery.setAdapter(adapter);
       gallery.setOnItemSelectedListener(new OnItemSelectedListener()
       {
 
           //当Gallery选项中项发生变化时触发该方法
           @Override
           public void onItemSelected(AdapterView<?> parent, View view,
                  int position, long id) {
              imageView.setImageResource(imageIds[position]);
           }
           @Override
           public void onNothingSelected(AdapterView<?> parent) {
             
           }
       });

PSAndroidR.styleable无法解析时候的解决办法

       程序编译时出错,提示说“R.styleable无法解析,或者它不是字段” 在网上查了下,说R.styleable在SDK1.5中已经不再支持,所以会出现这个错误。解决方法如下:

在res/values目录下新建styleable.xml,添加内容

<?xml version="1.0"encoding="utf-8"?>
<resources>
    <declare-styleable name="Gallery">
        <attr name="android:galleryItemBackground"/>
    </declare-styleable>   
</resources>


问题解决

(android已不再推荐使用Gallery组件。尽量少使用。)

效果:

3.AdapterViewFlipper的功能和用法

AdapterViewFlipper继承了AdapterViewAnimator,它也会显示Adapter提供的多个View组件,但每次只能显示一个View组件,程序可通过showPrevious()和showNext()方法控制该组件显示上一个、下一个组件。

AdapterViewFlipper可以在多个View切换过程中使用渐隐渐现的动画效果,还可以调用该组件startFlipper()控制它“自动播放”。

实例:

Xml布局文件包含一个AdpaterViewFlipper:

    <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_alignParentBottom="true"

        android:layout_alignParentLeft="true"

        android:onClick="prev"

        android:text="上一个"

        />

       另外两个修改onClick,text即可```````

Activity代码,创建一个BaseAdapter对象,并创建三个按钮onClick事件提供处理方法

BaseAdapteradapter = new BaseAdapter()
       {
           @Override
           public int getCount() {
              return imageIds.length;
           }
 
           @Override
           public Object getItem(int position) {
              return position;
           }
 
           @Override
           public long getItemId(int position) {
              return position;
           }
           //该方法返回的View代表了每个列表项
           @Override
           public View getView(int position, View convertView, ViewGroupparent) {
              //创建一个ImageView
              ImageView imageView = new ImageView(AdapterViewFlipperT.this);
              imageView.setImageResource(imageIds[position]);
              //设置ImageView的缩放类型
              imageView.setScaleType(ImageView.ScaleType.FIT_XY);
              //为imageView设置布局参数
              imageView.setLayoutParams(new LayoutParams(
                     LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
              return imageView;
           }
       };
       flipper.setAdapter(adapter);
    }
    public void prev(View source)
    {
       //显示上一个组件
       flipper.showPrevious();
       //停止自动播放
       flipper.stopFlipping();
    }
    public void next(View source)
    {
       //显示下一个组件
       flipper.showNext();
       //停止自动播放
       flipper.stopFlipping();
    }
    public void auto(View source)
    {
       //开始自动播放
       flipper.startFlipping();
    }

Ps:在源工程文件下直接改API version
程序编译时出现错误View requires API level 11 (current min is 8)
解决方法:

在工程下找到 AndroidManifest.xml 文件 打开它 修改成

<uses-sdk android:minSdkVersion="8" />   就可了

效果:

4.StackView的功能和用法

       StackView也是AdapterViewAnimator的子类,以叠加方式显示多个列表项

实例:

Xml布局文件创建一个StackView和两个按钮

<StackView
        android:id="@+id/stackView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:loopViews="true"/>

Activity中创建一个SimpleAdapter和两个按钮的onCLick事件处理方法

//创建一个ListView对象,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();
    }
PS:eclipse中clean的作用

由于eclipse的编译是基于时间戳的判断机制的。
因此当你按build   all的时候有些eclipse认为时间戳没有改变的类不会被编译。
因此你可以先clean一下再编译。这个时候eclipse会将所有的以前编译信息清除然后编译。   
eclipse  --->project  ----->clean... 
选项将工程中的.class文件删除,同时重新编译工程,类似于jbuild中的rebuild 

效果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值