学习笔记|AS入门(五) 高级控件篇(上)

在以前的学习中咱们接触到了一些简单经常使用的控件和监听器,但这些在实际开发中是远远不够的,接下来一块儿来认识更高级的控件和更丰富的监听器,以及学会如何使用适配器搭建起数据源和视图界面的桥梁。高级控件篇第的一部分将围绕适配器讲解它是如何在某些高级控件发挥重要做用。本篇控件清单:

  • ListView 列表
  • Spinner 下拉列表
  • GridView 网格视图
  • ViewPager 视图滑动切换工具

那什么是数据适配器Adapter呢?如开头所说,它的做用是把复杂的数据填充在指定视图界面上。经常使用两种Adapter: ArrayAdapter(用于绑定单一的数据,数据源是数组或集合)SimpleAdapter(用于绑定格式复杂的数据,数据源是特定的泛型集合)。接下来将以ListView为例,看看这两种适配器的使用方法和效果。

1.ListView 列表python

ListView是最为经常使用的控件之一,它以列表的形式展现具体内容,而且可以根据数据的长度自适应显示。下图是一个每项数据只有一行文本的ListView效果图,对于这类单一数据,用ArrayAdapter加载数据再合适不过,接下来一块儿学习一下。android

布局界面只须要一个ListView,设置好宽高和id就够了。另外,还经常使用属性android:divider设置列表分割线的颜色,如透明色 #00000000.数组

在MainActivity用id找到布局中的ListView以后,就是加载适配器的过程了:缓存

能够看到使用过程无非三个步骤:数据源准备->适配器加载数据源->控件加载适配器,在关键的第二步对ArrayAdapter初始化中,提供的三个参数完成了在哪里显示、每一项数据如何显示(这里直接使用安卓提供好一个布局)、显示哪些数据及有多少项这些任务,再set到ListView上,就实现了一开始看到的界面效果。因此ListView只负责加载和管理视图,其余显示内容都是交给Adapter去作的。app

固然ListView的每一项Item都是能够被监听的,监听器是OnItemClickListener,其中返回的参数position表示被点击的某项在整个List中的位置,从0起算,这样就能用ListView的getItemAtPosition()方法获取到被点击项的内容:ide

当点击第一项“wifi”时效果以下:函数

接下来再看一个页面效果:工具

在这个ListView能看到每一个Item再也不是简单的一行,有文字也有图片,这种格式复杂的数据就要用到SimpleAdapter了,仍是在main.xml里准备好ListView控件,再回到MainActivity来学习如何用以前学会的三步骤来加载SimpleAdapter吧!布局

第一步准备数据源,能够看到数据源dataList是一个特定的泛型集合,这里String表明文字,Object表明图片,而后调用getData()初始化dataList。post

每个Map对应一项Item,为了方便用for循环让每一个Item里图标都同样,文字内容递增就能够,而后添加到dataList,这样就完成一个有20项Item的List。这里注意Map键值对里的键名,后面会须要。

第二步适配器加载数据源,在此以前,须要给列表每一项作个布局item.xml,这个不难理解,由于在ArrayAdpter例子里咱们直接使用系统提供的布局而已。注意要给出TextView和ImageView的id,立刻就会用到。

如今又到了关键一步,SimpleAdapter初始化比较复杂,须要用到五个参数,前三个容易理解,后两个就是以前须要留心的两个要点。这一步实现了控件与数据的一一绑定。最后一步加载适配器就大功告成了!

如今再介绍ListView上经常使用的监听器OnScrollListener,用于监听滚动变化,当用户拉到列表最底下的时候可帮助视图在滚动中加载数据。如今为列表设置监听器listView.setOnScrollListener(this),并实现onScrollStateChanged ()、onScroll()方法。

这里重写第一个方法,能看到事件会返回一个scrollState,它有三个状态值,下图打印出详细描述。由于须要在视图一直滑动到底端给出新的Item,为dataList增添新的map以后,要用到adpter很是关键的方法**notifyDataSetChanged()**通知适配器数据发生了变化要从新加载数据,这再次印证以前所说数据的显示是适配器的工做而不是列表。

效果以下,能够看到当用户看完20项继续向下拖时就会有源源不断的新内容更新上来。

学完这两个经常使用适配器使用和适用状况以后,对比可看出ArrayAdapter使用起来明显简单许多,思考一个问题,ArrayAdapter的第二个参数若是不用系统提供的列表项布局而是自定义布局,是否也能作到图文并存的效果呢?答案是确定的,只不过须要自定义一个适配器继承ArrayAdapter并重写一些方法了。下面就来学习如何定制一个ListView界面吧!

此次作一个更好看的界面,准备好小动物的图片就能够开始大展身手了!

回忆一下实例化一个ArrayAdapter时须要的三个参数,其中列表项布局以及适配器的适配类型都是要从新考虑的。那么先就从这开始准备吧!

每一个Item都是由左边一张图片和右边一行文本组成的,下面代码中须要解释的是使用 tools: 的属性在咱们预览能看到效果但不会出如今运行后的布局,方便咱们提早看效果又不至于影响后续工做。

接着须要准备一个实体类Animal做为适配器的适配类型,这个类里提供动物图片和名称两个属性、用来初始化属性的构造方法以及对应的get方法便可。

而后到了关键一步,建立一个自定义的适配器且继承ArrayAdapter,重写父类一组含三个参数的构造函数,并将列表项子布局的id保存下来。接着重写getView()方法,先用getItem(position)获得当前Item项的Animal实例,再用LayoutInflater系列方法把子布局传入当前布局获得一个View,接着调用这个View的findViewById()找到ImageView和TextView实例,这样就能够把从当前项对象get的内容设置到这两个控件里去显示图片和文字了。

一切准备就绪以后,后面的步骤基本信手拈来了,相信下面这段代码你必定没问题了。

点击某个Item也会有响应:

这里对getView()多提几句,若是咱们只是用上面几行代码来运行ListView的话效率会很是低,由于每次为了要显示每一个子项去调用getView()方法后都会将布局从新加载一遍,若是能将显示过的Item View缓存起来,之后出现直接复用就能达到提高ListView运行效率的效果了。优化后代码以下:

如下是源代码:

public View getView(int position, View convertView, ViewGroup parent) {
        Animal animal=getItem(position);
        View view;
        ViewHolder viewHolder;
        if(convertView==null){
            view=LayoutInflater.from(getContext()).inflate(resourceId, null);
            viewHolder=new ViewHolder();
            viewHolder.imageView= (ImageView) view.findViewById(R.id.animal_image);
            viewHolder.textView= (TextView) view.findViewById(R.id.animal_name);
            view.setTag(viewHolder);
        }else{
            view=convertView;
            viewHolder = (ViewHolder) view.getTag();
        }

        viewHolder.textView.setText(animal.getAnimalName());
        viewHolder.imageView.setImageResource(animal.getImageId());
        return view;
    }

    class ViewHolder{

        ImageView imageView;
        TextView textView;
    }
}
复制代码

到此学了这么多,相信你对适配器能够熟练使用了吧!只要三步就搞定。想必在其余控件上应用适配器也很容易了,下面快来再认识两个高级控件。

2.Spinner 下拉列表

与ListView相似的,每一个下拉列表项对应一个Item,列表项内容通常是文字,用ArrayAdapter就能作到,举一反三,相信作一个下图所示的下拉列表已经难不倒你了!

选择系统提供的一个布局做为Spinnner的菜单样式,注意是设置在适配器上,这里给Spinner安装监听器是OnItemSelectListener,用适配器和列表均可以定位到某Item,完成后效果以下:

3.GridView 网格视图

从名字中能看出来GridView的特色,它使得每一个Item以网格的形式展示,除此以外使用方式和ListView很是类似。下面准备用SimpleAdapter作一个这样的Demo:

GirdView自己还有些经常使用的属性: android:verticalSpacing(两列之间的间距),android:horizontalSpacing(两行之间的间距), android:numColumns(每行显示多少列,选值为auto_fit表示自动适应展现几列)。

接下来就是GridView绑定SimpleAdapter的过程了,再也不细说,须要强调这里把图标和文字分别放在两个数组中且一一对应以便能经过循环获得数据源dataList。监听器是OnItemClickListener

最后为了界面美观,在注册该活动时候设置theme是Black且NoTitleBar,注意被设置成**android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"**的活动必定继承的是android.app包下Activity,若是是V7兼容包下的AppCompatActivity会致使程序崩溃没法打开。点击运行来看看是否是达到上面的效果了呢?

其实除了这两个经常使用Adatper,还有一些Adapter也实用,下面经过ViewPager控件再来认识一个Adapter。

4.ViewPager 视图滑动切换工具

ViewPager是android扩展包v4包中的类,这个类可让用户左右切换当前的视图(View、Fragment均可以),不少APP都用到这个功能,可见其重要程度,所以想用这点篇幅详解ViewPager是彻底不够的,这里就仅仅给你们介绍用来帮助ViewPager管理View数据源的适配器PagerAdapter,感觉一下风格各样的适配器。

首先在布局里导入v4包两个控件,其中PagerTabStrip是ViewPager子标签,包含在ViewPager里,这里用它做标题。

因为PagerAdapter是抽象类,使用时须要自定义子类。初始化时让这个适配器获取到两个数据源List:页卡List和标题List,以后重写几个方法更好的完善这个适配器的功能。

接着三步骤,在主活动准备好两个List,这里用View.inflate ()方法将布局转化成View对象,数据加载到自定义适配器上,adapter加载到ViewPager便可,又给ViewPager设置监听器OnPageChangeListener监听页卡是否发生变化。另外,咱们还获取到控件PagerTabStrip去给标题作些美化工做。

最后效果如图,手指左右滑动就能够实现页面切换了。

其实全部这些Adapter都是从父类BaseAdapter扩展而来的,也就是说咱们也能够根据本身的须要自定义一个Adapter继承BaseAdapter,而后具体实现下面4个方法:

因为adapter中含有要显示的数据集合,数据集合中元素个数便可被展现的View个数,每一个数据的获取、每一个Item View的样式都由adapter控制,每一个position位置上数据都绑定到Item View上,这样数据和视图也就结合在一块儿了。因为篇幅缘由不在这里接着具体展开,后续再深刻探究。

本篇先到这里,下一篇还有更多有趣的高级控件等咱们学习~

相关文章
相关标签/搜索