• Android开发10.1:UI组件适配器AdapterView(创建ListView,Adapter接口)


    @version:Android4.3 API18

    @author:liuxinming

    概述

                  AdapterView继承了ViewGroup,它的本质是容器
                  AdapterView 可以包含多个 “列表项”,并将多个“列表项”以合适的形式显示出来
                  AdapterView显示的多个“列表项”由Adapter提供

    类图



    ListView(列表视图)

    ListView以垂直列表的形式显示所有列表项

    创建方式:

                              1、直接使用ListView创建
                              2、让Activity继承ListActivity(相当于该Activity显示的组件为ListView)
    在程序中获得了ListView之后,接下来就需要为ListView设置它要显示的列表项
    注释:ListView、GridView、Spinner、Gallery等AdapterView都只是容器,而Adapter负责提供每个“列表项”组件,AdapterView则负责采用合适的方式显示这些列表项

    XML属性

    AbsListView属性

    XML属性 相关方法 说明
    android:choiceMode   设置AbsListView的选择行为,支持下列属性值
    none:不显示任何选中项 value=0
    singleChoice:允许单选 value=1
    multipleChoice:允许多选 value=2
    multipleChoiceModal:允许多选 value=3
    android:DrawSelectorOnTop setDrawSelectoronTop(boolean) true:选中的列项将会显示在上面
    android:fastScrollEnabled   设置是否允许快速滚动
    true:显示滚动图标,并允许用户拖动该滚动图标进行快速滚动
    android:listSelector setSelector(int) 指定被选中的列表项上绘制的Drawable
    android:scrollingCache   true:该组件在滚动时将会使用绘制缓存
    android:smoothScrollbar setSmoothScrollbarEnable(boolean) false:则不在header View之后绘制分割线
    android:stackFromBottom   设置是否从底端开始排列列表项
    android:textFilterEnable   设置是否对列表项进行过滤
    注释:当该AbsListView对应的Adapter实现了Filter接口时该属性才会起作用
    android:transcriptMode   设置该组件的滚动模式。该属性支持如下属性
    disabled:关闭滚动。默认值
    normal:当该AbsListView受到数据改变通知,且最后一个列表项可见时,该AbsListView将会滚动到底端
    alwaysScroll:该AbsListView总会自动滚动到底端

    ListView常用XML属性
    android:divider 设置List列表项的分割线(即可用颜色分割,也可用Drawable分割)
    android:dividerHeight 分割线的高度
    android:entries 指定一个数组资源,Android将根据该数组资源来生成ListView
    android:footerDividersEnabled false:则不在footer View之前绘制分隔线
    android:headerDividersEnabled false:则不在header View之后绘制分隔线

    使用数组创建ListView实例

    Android_ListView/res/layout/activity_main.xml
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
     >
        <!-- 使用数组资源给出列表项 -->
        <ListView 
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:entries="@array/code"
            android:divider="#f00"
            android:dividerHeight="2dp"
            android:headerDividersEnabled="false"
            />
    </LinearLayout>

    Android_ListView/res/values/arrays.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <resources>
        <string-array name="code">
            <item>Android</item>
            <item>PHP</item>
            <item>Java</item>
            <item>C</item>
            <item>C++</item>
        </string-array>
    </resources>


    调试效果
    这是一个比较简单的案例,这种方式创建ListView能定制的内容很少


    Adapter(接口)

         Adapter本身只是一个接口
         它派生了ListAdapter和SpinnerAdapter两个子接口,其中ListAdapter为AbsListView提供列表项,而SpinnerAdapter为AbsSpinner提供列表项

    接口及其实现类的继承关系类图

        接口间接类较多,可能画的有点凌乱,我整理了很几次,看着也好像有点凌乱,呵呵。凑活着看吧

    Adapter常用的实现类

    1、ArrrayAdapter:简单、易用,通常用于数组或List集合的多个值包装成多个列表项
    2、SimpleAdapter:功能有点强,可用于将List集合的多个对象包装成多个列表项
    3、SimpleCursorAdapter:与SimpleAdapter基本相似,只是用于包装Cursor提供的数据
    4、BaseAdapter:通常用于被扩展。扩展BaseAdapter可以对各列表项进行最大限度的定制

    实现类一:ArrayAdapter实例

        设计场景:通过界面布局定义两个ListView,但这两个ListView都不指定android:entries属性(哈哈,区别来啦,前面一个简单例子,我们是通过配置XML数组资源)
                            我们通过Activity为两个ListView提供Adapter,Adapter来控制所显示的列表项
                            注释:这个有点像WEB开发的模板机制,定义好数据格式后,通过后端程序来控制数据资源需要显示的内容。
        Android_ListView/layout/Activity_main.xml
        
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
     >
        <!-- 定义两个ListView -->
        <ListView 
            android:id="@+id/list01"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:divider="#f00"
            android:dividerHeight="2dp"
            android:headerDividersEnabled="false"
            />
        <ListView 
            android:id="@+id/list02"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:divider="#f00"
            android:dividerHeight="2dp"
            android:headerDividersEnabled="false"
            />
    </LinearLayout>
     Android_ListView/res/layout/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="24sp"
        android:padding="10dp"
        android:shadowColor="#f0f"
        android:shadowDx="4"
        android:shadowDy="4"
        android:shadowRadius="2"
        />

    Android_ListView/res/layout/checked_item.xml
    <?xml version="1.0" encoding="utf-8"?>
    <CheckedTextView
    	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="24sp"
    	android:checkMark="@drawable/ok"
    	android:shadowColor="#f0f"
    	android:shadowDx="4"
    	android:shadowDy="4"
    	android:shadowRadius="2"/>

    Android_ListView/src/com/example/android_listview/MianActiviy.java
    package com.example.android_listview;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.view.Menu;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;
    
    public class MainActivity extends Activity {
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		ListView list01 = (ListView) findViewById(R.id.list01);
    		ListView list02 = (ListView) findViewById(R.id.list02);
    		//定义数组
    		String[] data1 = {"屌丝","高富帅","白富美"};
    		String[] data2 = {"Android","PHP","Java","C","C++"};
    		
    		//将数组包装为ArrayAdapter
    		ArrayAdapter<String> adapter1 = new ArrayAdapter<String>
    		(this,R.layout.array_item,data1);
    		ArrayAdapter<String> adapter2 = new ArrayAdapter<String>
    		(this,R.layout.checked_item,data2);
    		
    		//为ListView 设置 Adapter
    		list01.setAdapter(adapter1);
    		list02.setAdapter(adapter2);
    	}
    
    	@Override
    	public boolean onCreateOptionsMenu(Menu menu) {
    		// Inflate the menu; this adds items to the action bar if it is present.
    		getMenuInflater().inflate(R.menu.main, menu);
    		return true;
    	}
    
    }
    

    调试效果
     知识点:
                   ArrayAdapter<String> adapter1 = new ArrayAdapter<String>
    (this,R.layout.array_item,data1)
                 创建ArrayAdapter时必须指定的三个参数:
                 1、Context:代表了访问整个Android应用的接口。
                 2、textViewResourceld:一个资源ID,该资源ID代表一个TextView,该TextView组件将作为ArrayAdapter的列表项组件
                 3、数组或List:该数组或List将负责为多个列表项提供数据

    ListActivity实现列表

    如果窗口仅仅需要显示一个列表,则可以直接让Activity继承ListActivity来实现,ListActivity的子类无需调用setContentView()方法来显示某个界面
    而是可以直接传入一个内容Adapter,ListActivity子类就呈现出一个列表

    Android_ListView/src/com/example/android_listview/MianActiviy.java
    package com.example.android_listview;
    
    import android.app.ListActivity;
    import android.os.Bundle;
    import android.widget.ArrayAdapter;
    
    /**
     * @author  LiuxinMing 1235355@qq.com
     */
    public class MainActivity extends ListActivity
    {
    	@Override
    	public void onCreate(Bundle savedInstanceState)
    	{
    		super.onCreate(savedInstanceState);
    		// 无需使用布局文件
    		String[] arr = {"屌丝","高富帅","白富美"};
    		// 创建ArrayAdapter对象
    		ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
    			android.R.layout.simple_list_item_multiple_choice, arr);
    		// 设置该窗口显示列表
    		setListAdapter(adapter);
    	}
    }

    调试效果:



    未完待续.....
  • 相关阅读:
    Cloud7为全球移动互联网大会提供手机门户支撑 开源CMS
    揭东县信息中心采用We7站群管理系统重新架构揭东县政务网 开源CMS
    中国计算机报:We7云计算重塑政府门户网站群 开源CMS
    We7网站群系统全新打造辽宁省民政厅网站群平台 开源CMS
    We7网站群为华中科技大学同济医学院附属同济医院提供专业网... 开源CMS
    sso实现原理解析
    TDSQL | DB·洞见回顾|基于LSMTree存储的数据库性能改进
    又拿奖了!腾讯云原生数据库TDSQLC斩获2021PostgreSQL中国最佳数据库产品奖
    为云而生,云原生数据库TDSQLC技术突破与演进
    金融级数据库新坐标:腾讯云TDSQL发布全自研新敏态引擎
  • 原文地址:https://www.cnblogs.com/pangblog/p/3317854.html
Copyright © 2020-2023  润新知