【Android 开发】:UI控件之 ListView 列表控件的使用

来源:互联网 发布:mac桌面文件夹没了 编辑:程序博客网 时间:2024/04/30 10:13

1. Android中 ListView 概括   

    Android中的列表控件非常灵活,可以自定义每一个列表项,实际上每一个列表项就是一个View

    在Android定义了3个列表控件:ListView、ExpandableListView 和 Spinner,其中Spinner就是在Windows中常见的下拉列表框。

    ListView控件用于列表的形式显示数据,ListView控件采用MVC模式将前端显示和后端数据进行分离。也就是说,ListView控件在装载数据时并不是直接使用 ListView.add 或者类似的方法添加数据,而是需要指定一个Adapter对象。

MVC模式中的C(控制器,Controller) -----> Adapter

MVC模式中的V(视图,View)         -----> ListView,用于显示数据。

MVC模式中的M(模型,Model)        ----->  为ListView提供数据的List或数组

  在ListView控件中通过Adapter对象获得需要显示的数据,在创建Adapter对象时需要指定要显示的数据(List或数组对象),因此,要显示的数据与ListView之间通过Adapter对象进行连接,同时又互相独立,也就是说,ListView只知道显示的数据来自Adapter,并不知道这些数据来自List还是数组。

   对于数据本身来说,只是知道将这些数据添加到Adapter对象中,并不知道这些数据会被用于ListView控件或其他控件。如图所示:

这边的ArrayList可以手工去生成,而Coursor是一个游标的操作,一般是数据库方面的了


2. MVC模式的优点

    MVC把应用程序的逻辑层与界面是完全分开的,最大的好处是:界面设计人员可以直接参与到界面开发,程序员就可以把精力放在逻辑层上。而不是像以前那样,设计人员把所有的材料交给开发人员,由开发人员来实现界面。在Eclipes工具中开发Android采用了更加简单的方法,设计人员在AnroidDraw中设计界面,以XML方式保存,在Eclipes中直接打开就可以看到设计人员设计的界面。逻辑处理的代码则放在src文件夹下。让程序员更专注与业务。[实际上在Android开发中,UI界面的设计也主要是由Anroid程序员来实现的,美工处理的一般是图片方面的设计等]

1) 视图层(View):一般采用XML文件进行界面的描述,使用的时候可以非常方便的引入。同时便于后期界面的修改。逻辑中与界面对应的id不变化则代码不用修改,大大增强了代码的可维护性。

2) 控制层(Controller):Android的控制层的重任通常落在了众多的Acitvity的肩上,这句话也就暗含了不要在Acitivity中写代码,要通过Activity交割Model业务逻辑层处理,这样做的另外一个原因是Android中的Acitivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。[耗时的操作,例如从网络中取数据]

3) 模型层(Model):对数据库的操作、对网络等的操作都应该在Model里面处理,当然对业务计算等操作也是必须放在的该层的。就是应用程序中二进制的数据。

3. 案例的实现

实战案例一:ListView普通列表控件的使用

在实现之前,我们需要补充一些关于ListView的知识,首先查看一下Android api文档的ListView.

1) ListView:这是一个用来显示可以垂直滚动的列表,这里面的选项都是来自与这个视图关联的 ListAdapter 中。

【重点】我们主要用到的是ListView中的 public void setAdapter (ListAdapter adapter)方法。它的作用是在ListView 中设置适配器,主要是做一些数据的处理,查看 ListAdapter 接口可以发现很多实现它的子类,来满足我们展示不同界面的数据的需求。如我们案例中要用到的的ArrayAdapter<T>

2) ArrayAdapter<T> : 这是一个基于数组的对象的集合,继承BaseAdaper,默认的这个类它会提供一个资源id来关联到一个简单的TextView的样式,如果你想要一个更复杂的布局,也可以自定义的去构建然后提供相应的资源id。查看它的构造方法如下:

这里我们使用第三个构造方法

public ArrayAdapter (Context context, int textViewResourceId, T[] objects)

1. 第一个参数表示上下问对象

2. 第二个参数表示关联到TextView的样式的id

3. 第三个参数表示构造的数据源,也就文章开头中的 MVC 模型中的 Model。

3) 案例实现

1) 布局文件

<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context=".MainActivity" >    <!-- 让当前的 ListView 充满整个屏幕  -->    <ListView        android:id="@+id/listview"        android:layout_width="match_parent"        android:layout_height="match_parent" >    </ListView></RelativeLayout>

2) MyDataSource.java 作为数据源

public class MyDataSource {    public MyDataSource() {        // TODO Auto-generated constructor stub    }        public static List<String> getDataSource(){        List<String> list = new ArrayList<String>();        list.add("北京");        list.add("上海");        list.add("广州");        list.add("湖北");        list.add("湖南");        list.add("长沙");        list.add("深圳");               return list;        }}
3) 程序主要代码

public class MainActivity extends Activity {        private ListView listView;    private ArrayAdapter<String> adapter;    //作为数据源来使用    private List<String> data = null;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initComponent();        data = MyDataSource.getDataSource();               adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, data);        listView.setAdapter(adapter);    }    @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;    }        private void initComponent(){        listView = (ListView)findViewById(R.id.listview);            }}

4) 程序执行结果


实战案例二:为ListView列表项添加单选框

  在上面案例的基础上进行适当的修改,我们先查一下ListView的api文档中的 public void setChoiceMode (int choiceMode)方法,这个表示给 ListView 添加样式,它有以下几种方式

1) 案例实现:

修改第一个案例中的 MainActivity.java

...    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initComponent();        data = MyDataSource.getDataSource();               adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_single_choice, data);        //给每一个选项添加单选选项。        //设置ListView的选择的样式为单选列表        listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);        listView.setAdapter(adapter);         }...

2) 案例执行结果:


实战案例三:为ListView列表项添加复选框

1) 案例实现

修改第一个案例中的 MainActivity.java

...    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initComponent();        data = MyDataSource.getDataSource();       /*        adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_single_choice, data);        //给每一个选项添加单选选项。        //设置ListView的选择的样式为单选列表        listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);*/                //设置多选操作        adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_multiple_choice, data);        listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);        listView.setAdapter(adapter);    }...

2) 案例执行结果

3) 在这里我们给它添加一个事件,ListView有很多触发的事件,读者可以自己去查看Android的官方文档

修改上述程序的主文件 MainActivity.java

...    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initComponent();        data = MyDataSource.getDataSource();       /*        adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_single_choice, data);        //给每一个选项添加单选选项。        //设置ListView的选择的样式为单选列表        listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);*/                //设置多选操作        adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_multiple_choice, data);        listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);        listView.setAdapter(adapter);        //添加ListView长按的事件        listView.setOnItemLongClickListener(new OnItemLongClickListener() {            @Override            public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {                // TODO Auto-generated method stub                Toast.makeText(MainActivity.this, "click me", 1).show();                return false;            }        });    }...



原创粉丝点击