用户名:HelloToDays 文章数:26 评论数:10
访问量:737:422:300:2 注册日期:2013-07-22
所谓高级控件就是指不能拖过来直接用的控件,我们需要在对它们进行管理和控制之后才能使用,与之一起使用的还有一些对应的控制器、相关数据集等。这一篇里我们先简单介绍一下高级控件中的AdapterView控件,当然我们也需要先要知道与之对应的控制器��适配器Adapter,以及数据源DataSource,和三者之间的关系。
我们都应该听过或者了解MVC框架吧,MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用于组织代码用一种业务逻辑和数据显示分离的方法,这个方法的假设前提是如果业务逻辑被聚集到一个部件里面,而且界面和用户围绕数据的交互能被改进和个性化定制而不需要重新编写业务逻辑MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。MVC的结构图如下:
到此为止,我们已经明白了这个框架的原理,简单的来说就是利用控制器(C)将数据集(M)与视图(V)对应起来。好吧,我们用这个思想说说Adapter、AdapterView和DataSource之间的关系:
Adapter��C(控制器)
AdapterView��V(视图)
DataSource��M(数据集)
明白了这个关系,我们就可以进入今天的主讲内容了:
(1)Adapter类及其相关类和接口;
(2)AdapterView控件之一ListView;
1.ArrayAdapter类的使用
通过ArrayAdapter我们只能绑定数据到TextView控件中,其他的不多说,直接看下面的代码,注意的地方我都标记了注释:
(1)MainActivity.java
package com.example.arrayadapter; import android.app.Activity; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.ListView; public class MainActivity extends Activity { //声明视图ListView控件 private ListView lv; //声明适配器(控制器)ArrayAdapter private ArrayAdapter<String> aAdapter; //声明并定义数据源 private String datas[]={ "Wireless & networks","Call settings","Sound","Display","Location & security", "Applications","Accounts & sync","Privacy","CD card & phone storage","Search","Language & keyboard", "Voice input & output","Accessibility","Date & Time","About phone"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //实现适配器,包括三个参数 aAdapter=new ArrayAdapter<String>(this, R.layout.cell,datas); lv=(ListView)findViewById(R.id.listView1); //通过Adapter的setAdapter方法绑定数据于视图 lv.setAdapter(aAdapter); } }
(2)activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#000000" tools:context=".MainActivity" > <ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" > </ListView> </LinearLayout>
(3)引入的资源文件cell.xml
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="50dip" android:gravity="center_vertical" android:id="@+id/tv" android:textColor="#ffffff"></TextView>
(4)实现效果如下:
2.SimpleAdapter类的使用
相对于ArrayAdapter而言SimpleAdapter的实现的功能更全面一些,不仅可也实现TextView的绑定,还可以在引用的资源文件(cell.xml)中使用布局,从而绑定ImageView等其他一些控件,接下来我们就来完善上面这个布局:
(1)MainActivity.java
package com.example.arrayadapter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import android.os.Bundle; import android.widget.ListView; import android.widget.SimpleAdapter; public class MainActivity extends Activity { //声明视图ListView控件 private ListView lv; //声明适配器(控制器)SimpleAdapter private SimpleAdapter sAdapter; //声明List和Map存放数据 private List<Map<String,Object>> lists; private Map<String ,Object> maps; //声明并定义数据源 private String datas[]={ "Wireless & networks","Call settings","Sound","Display","Location & security", "Applications","Accounts & sync","Privacy","CD card & phone storage","Search", "Language & keyboard","Voice input & output","Accessibility","Date & Time","About phone"}; private int image[]={ R.drawable.ic_settings_wireless,R.drawable.ic_settings_call,R.drawable.ic_settings_sound, R.drawable.ic_settings_display,R.drawable.ic_settings_location,R.drawable.ic_settings_applications, R.drawable.ic_settings_sync,R.drawable.ic_bt_config,R.drawable.ic_settings_sim, R.drawable.ic_power_system,R.drawable.ic_settings_language,R.drawable.ic_settings_voice_calls, R.drawable.ic_settings_accessibility,R.drawable.ic_settings_date_time,R.drawable.ic_settings_about}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lv=(ListView)findViewById(R.id.listView1); lists=new ArrayList<Map<String,Object>>(); //通过for循环添加数据 for(int i=0;i<image.length;i++){ maps=new HashMap<String,Object>(); maps.put("data", datas); maps.put("image", image); lists.add(maps); } //实现SimpleAdapter适配器,有5个参数 sAdapter=new SimpleAdapter(this, lists, R.layout.cell, new String[]{"data","image"}, new int[]{R.id.tv,R.id.iv}); //通过Adapter的setAdapter方法绑定数据于视图 lv.setAdapter(sAdapter); } }
(2)activity_main.java同上
(3)资源文件cell.java
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" tools:context=".MainActivity" > <ImageView android:layout_width="50dip" android:layout_height="50dip" android:id="@+id/iv"/> <TextView android:layout_width="fill_parent" android:layout_height="50dip" android:gravity="center_vertical" android:id="@+id/tv" android:textColor="#ffffff"></TextView> </LinearLayout>
(4)测试结果图:
3.自定义的Adapter��BaseAdapter的使用:
如果系统提供的适配器不能满足开发人员的要求,我们也可以通过BaseAdapter来自定义满足需要的适配器,这里为了说明情况我们就用BaseAdapter自定义的适配器(下面我们叫MyAdapter)来完成和上面相同的功能。
(1)MyAdapter.java(新建的类,实现自定义的适配器)
package myAdapter; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.example.arrayadapter.R; public class MyAdapter extends BaseAdapter{ private Context context; private String data[]; private int image[]; public MyAdapter(Context context,String[] data
没有评论:
发表评论