ListView与adapter用法

一个ListView通常有两个职责。
(1)将数据填充到布局。
(2)处理用户的选择点击等操作。
一个ListView的创建需要3个元素。
(1)ListView中的每一列的View。
(2)填入View的数据或者图片等。
(3)连接数据与ListView的适配器。
也就是说,要使用ListView,首先要了解什么是适配器。适配器是一个连接数据和AdapterView(ListView就是一个典型的AdapterView)的桥梁,通过它能有效地实现数据与AdapterView的分离设置,使AdapterView与数据的绑定更加简便,修改更加方便
Android中提供了很多的Adapter,以下列出了常用的几个。

ArrayAdapter
用来绑定一个数组,支持泛型操作

SimpleAdapter
用来绑定在xml中定义的控件对应的数据

SimpleCursorAdapter
用来绑定游标得到的数据

BaseAdapter
通用的基础适配器

  1. ListView使用ArrayAdapter
    首先创建activity_main布局,在布局中定义一个ListView
<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">
    <ListView
        android:id="@+id/listView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
    />
</RelativeLayout>

MainActivity.java程式

package com.example.uilistviewtest;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends Activity {
    private String[] data = {"Apple","Banana","Orange","Pear","Grape","Watermelon","Cherry","Mango","Strawberry","Pineapple"};
    ListView listView;
    ArrayAdapter<String> adapter ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("ArrayAdapter Demo");
        listView = (ListView)findViewById(R.id.listView);

        //带有RadioButton 的ListView 
        adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_single_choice,data);
        listView.setAdapter(adapter);
        listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);  //多选
        listView.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                // TODO Auto-generated method stub
                Toast.makeText(MainActivity.this, "you click " + position, Toast.LENGTH_SHORT).show();
                switch (position) {
                case 0:
                    finish();
                    break;
                case 7:
                    Intent intent = new Intent(MainActivity.this,SecondActivity.class);
                    startActivity(intent);

                    break;

                default:
                    break;
                }
            }
        });
    }

    @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;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        switch (item.getItemId()) {
        case R.id.add:
            Toast.makeText(MainActivity.this, "click add menu", Toast.LENGTH_SHORT).show();
            break;
        case R.id.remove:
            Toast.makeText(MainActivity.this, "click remove menu", Toast.LENGTH_SHORT).show();
            finish();
            break;
        default:
            break;
        }
        return true;
    }
}

分析一下使用的步骤。
(1)定义一个数组来存放ListView中item的内容。
(2)通过实现ArrayAdapter的构造函数来创建一个ArrayAdapter的对象。
(3)通过ListView的setAdapter()方法绑定ArrayAdapter。
其中第二步有必要说一下的是,ArrayAdapter有多个构造函数,例子中实现的是最常用的一种。第一个参数为上下文,第二个参数为一个包含TextView,用来填充ListView的每一行的布局资源ID。第三个参数为ListView的内容。其中第二个参数可以自定义一个layout,但是这个layout必须要有TextView控件。通常我们使用Android提供的资源,除了例子中所用的,常用的还有如下几种,可实现带RadioButton和CheckBox的ListView。
1、android.R.layout.simple_list_item_1 实现带TextView的ListView
2、android.R.layout.simple_list_item_checked 实现带选择框的ListView,需要用setChoiceMode()方法设定选择为多选还是单选,否则将不能实现选择效果
3、android.R.layout.simple_list_item_multiple_choice实现带CheckBox的ListView。需要用setChoiceMode()方法来设置单选或者多选
4、android.R.layout.simple_list_item_single_choice这个资源实现带RadioButton的ListView。这里要注意的是,这里并不是指定了单选。是多选还是单选要通过setChoiceMode()方法来指定
ListView中的四种模式:
* CHOICE_MODE_NONE 是普通模式,
* CHOICE_MODE_SINGLE 是单选模式,不常用,
* CHOICE_MODE_MULTIPLE 和 CHOICE_MODE_MULTIPLE_MODAL 都是多选模式
四种模式写法如下:

//带TextView 的ListView android.R.layout.simple_list_item_1
        adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1,data);
        listView.setAdapter(adapter);

//带选择框的ListView android.R.layout.simple_list_item_checked
        adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_checked,data);
        listView.setAdapter(adapter);
        listView.setChoiceMode(listView.CHOICE_MODE_MULTIPLE);  //多选

//带有复选框的ListView android.R.layout.simple_list_item_multiple_choice
        adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_multiple_choice,data);
        listView.setAdapter(adapter);
        listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

//带有RadioButton 的ListView 
        adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_single_choice,data);
        listView.setAdapter(adapter);
        listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);  //单选
        listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);  //多选
  1. ListView使用SimpleAdapter
    我们在ListView除了展示一些文字外,还需要显示一些图片或者button,这是需要使用到SimpleAdapter。
    SimpleAdapter可以通过它自定义ListView中的item的内容,比如图片、多选框等。
    首先创建一个ListView 的每一行的布局,每行显示两行文字以及一张图片。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <ImageView 
        android:id="@+id/imageView2_1"
        android:layout_alignParentRight="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
    <TextView
        android:id="@+id/textView2_1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"/>
    <TextView
        android:id="@+id/textView2_2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@id/textView2_1"/>
</RelativeLayout>

另外创建布局文件,该布局文件中定义一个ListView控件。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <ListView 
        android:id="@+id/listView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        ></ListView>
</LinearLayout>

JAVA程式:

package com.example.uilistviewtest;

import java.util.ArrayList;
import java.util.HashMap;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class SecondActivity extends Activity{
    private ListView listView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        setTitle("SimpleAdapter Demo");
        listView = (ListView)findViewById(R.id.listView);
        /*定义一个动态数组*/
         ArrayList<HashMap<String, Object>> listItem = new ArrayList<HashMap<String,Object>>();
         /*在数组中存放数据*/
         for(int i=0;i<10;i++)
                {
                 HashMap<String, Object> map = new HashMap<String, Object>();  
                 map.put("ItemImage", R.drawable.ic_launcher);//加入图片      
                 map.put("ItemTitle", "第"+i+"行");  
                 map.put("ItemText", "这是第"+i+"行");  
                 listItem.add(map);  
                } 
         SimpleAdapter mSimpleAdapter = new SimpleAdapter(
                 SecondActivity.this, //上下文
                 listItem,//需要绑定的数据
                 R.layout.item_second, //每一行的布局
                 new String[] {"ItemImage","ItemTitle", "ItemText"},  //每一行布局对应的数据键
                 new int[] {R.id.imageView2_1,R.id.textView2_1,R.id.textView2_2} //动态数组中的数据源的键对应到定义布局的View中
                 );
        listView.setAdapter(mSimpleAdapter);
        listView.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                // TODO Auto-generated method stub
                setTitle("您点击了第" + position + "行");
                Intent intent = new Intent(SecondActivity.this,ThirdActivity.class);
                startActivity(intent);
            }
        });
    }
}

使用simpleAdapter的数据一般都是用HashMap构成的列表,列表的每一节对应ListView的每一行。通过SimpleAdapter的构造函数,将HashMap的每个键的数据映射到布局文件中对应控件上。这个布局文件一般根据自己的需要来自己定义。梳理一下使用SimpleAdapter的步骤。
(1)根据需要定义ListView每行所实现的布局。
(2)定义一个HashMap构成的列表,将数据以键值对的方式存放在里面。
(3)构造SimpleAdapter对象。
(4)将LsitView绑定到SimpleAdapter上。
这里使用的SimpleAdapter构造方法有五个参数:
1、上下文;
2、需要绑定的数据,我们定义好的ArrayList
3、每一行的布局,我们之前创建的item_second 布局文件
4、每一行布局对应的数据源的键
5、数据源的键对应到布局的view中
通过setAdapter()方法绑定SimpleAdapter。

通过调用setOnItemClickListener方法为ListView设定监听,并复写OnItemClickeListener的onItemClick方法。

listView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                // TODO Auto-generated method stub
                setTitle("您点击了第" + position + "行");
                Intent intent = new Intent(SecondActivity.this,ThirdActivity.class);
                startActivity(intent);
            }
        });
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值