Android控件 – ListView的使用(一)– 使用Adapter绑定数据

ListView是Android最常使用的控件之一,要使用ListView要先了解适配器Adapter。适配器是一个连接数据和AdapterView(ListView就是一个典型的AdapterView)的桥梁,通过它能有效地实现数据与AdapterView的分离设置,使AdapterView与数据的绑定更加简便,修改更加方便。Android中常用的几个Adapter有:

Adapter

含义

ArrayAdapter<T>

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

SimpleAdapter

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

BaseAdapter

通用的基础适配器

ListView使用ArrayAdapter

ArrayAdapter使用非常简单,它只要是实现简单的数组里对象的字符串到layout中预先定义的TextView控件上的数据绑定。

示例:

1、  在布局XML中添加一个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">

<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>

2、  Activity代码:

public class MainActivity extends Activity {

    private static final String[] strs = new String[] {
        "一", "二", "三", "四", "五","六","七","八","九","十","十一","十二","十三","十四", "十五","十六","十七","十八","十九","二十","二十一","二十二","二十三"
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ListView lv = (ListView) findViewById(R.id.lv);
        lv.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, strs));
    }
}

说明:

ArrayAdapter的构造函数中第一个参数为context,第二个参数为包含TextView,其中也可以是自定义一个layout,但必须要有TextView,第三个参数就是ListView的内容。第二个参数可以使用android.R.layout.simple_list_item_checked或android.R.simple_list_item_single_choice资源,这样就可以实现带复选或单选的ListView,但是必须要用setChoiceMode()方法来设定多选还是单选,否则是无法选择的,如:lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);无论使用哪种资源,决定多选或单选是由setChoiceMode()方法来决定的。

ListView使用SimpleAdapter

有时候,我们除了要在ListView展示单调的文字外,还需要自定义一些内容,例如加入图片和多种文字等。这时就要使用SimpleAdapter了。SimpleAdapter可以通过它自定义item内容来实现一些灵活的布局

示例:

1、新建一个XML布局文件list_view_item.xml:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="50dp"
    android:layout_width="match_parent">
        <ImageView
            android:id="@+id/item_icon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@mipmap/ic_launcher"/>
        <TextView
            android:id="@+id/item_title"
            android:layout_height="match_parent"
            android:layout_width="match_parent"
            android:textSize="20sp"
            android:gravity="center_vertical"/>
</LinearLayout>

2、修改Activity代码:

public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ListView lv = (ListView) findViewById(R.id.lv);
        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("ItemIcon", R.mipmap.ic_launcher);
            map.put("ItemText", "这是第" + i + "行");
            listItem.add(map);
        }
        SimpleAdapter mSimpleAdapter = new SimpleAdapter(
                this,
                listItem,
                R.layout.list_view_item,
                new String[] {"ItemIcon", "ItemText"},
                new int[] {R.id.item_icon,R.id.item_title}
        );
        lv.setAdapter(mSimpleAdapter);
    }
}

说明:

 SimpleAdapter的构造函数中第一个参数为context,第二个参数接收一个Map数据源,本示例中使用了hashMap,将HashMap的每个键的数据映射到布局文件中对应控件上。

ListView使用BaseAdapter

虽然SimpleAdapter的自由度很高,但只能用于展示数据。如果想在每一个item里获得用户焦点和做一些处理用户的操作,例如item里包括按钮的使用。这时应该使用最灵活的适配器BaseAdapter。BaseAdapter它是一个抽象类,所以必须通过自定义一个继承类来实现,而且还要实现相应的一系列方法。

示例:

1、  修改list_view_item.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="50dp"
    android:layout_width="match_parent">
        <ImageView
            android:id="@+id/item_icon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@mipmap/ic_launcher"/>
        <TextView
            android:id="@+id/item_title"
            android:layout_height="match_parent"
            android:layout_width="match_parent"
            android:textSize="20sp"
            android:gravity="center"
            android:text="11111"/>
        <Button
            android:id="@+id/item_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Button"
            android:layout_alignParentRight="true"/>
</RelativeLayout>

2、  新建类MyAdapter:

public class MyAdapter extends BaseAdapter {
    private LayoutInflater mInflater;
    private ArrayList<HashMap<String, Object>> mListItem;

    public MyAdapter(Context context, ArrayList<HashMap<String, Object>> listItem) {
        this.mInflater = LayoutInflater.from(context);
        this.mListItem = listItem;
    }

    @Override
    public int getCount() {
        return mListItem.size();
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.list_view_item, null);
            holder = new ViewHolder();
            holder.icon = (ImageView) convertView.findViewById(R.id.item_icon);
            holder.title = (TextView) convertView.findViewById(R.id.item_title);
            holder.btn = (Button) convertView.findViewById(R.id.item_btn);
            convertView.setTag(holder); 
        }
        holder = (ViewHolder) convertView.getTag();
        holder.title.setText(mListItem.get(position).get("ItemTitle").toString());
        holder.btn.setText(mListItem.get(position).get("ItemBtnText").toString());
        holder.btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //
            }
        });
        return convertView;
    }

    public static class ViewHolder {
        public ImageView icon;
        public TextView title;
        public Button btn;
    }
}

3、  修改Activity:

public class MainActivity extends Activity {
	ArrayList<HashMap<String, Object>> mListItem;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		mListItem = new ArrayList<HashMap<String, Object>>();
		for (int i = 0; i < 30; i++) {
			HashMap<String, Object> map = new HashMap<String, Object>();
			map.put("ItemTitle", "第" + i + "行");
			map.put("ItemBtnText", "第" + i + "个按钮");
			mListItem.add(map);
		}
		ListView lv = (ListView) findViewById(R.id.lv);
		MyAdapter mAdapter = new MyAdapter(this, mListItem);
	   lv.setAdapter(mAdapter);
	}
}










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值