ListView控件和如何向ListView控件添加数据适配器

来源:互联网 发布:生理学软件 编辑:程序博客网 时间:2024/05/22 20:47

      ListView非常常用,它可以实现信息列表化及对列表信息的选择,这是实现往ListView各种适配器添加数据。适配器种类主要有SimpleAdapter,ArrayAdapter<T>,还有一种就是自己自定义的适配器。这里通过一个ListView控件使用各种适配器添加数据。

    首先定义一个主布局,在主布局里面添加一个TextView控件和一个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" >    <TextView         android:id="@+id/tv2"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="你选择了:"        />    <ListView        android:layout_below="@+id/tv2"        android:id="@+id/lv"        android:layout_width="match_parent"        android:layout_height="wrap_content"/></RelativeLayout>

接下来编写ListView控件中每个条目中的布局,也可以在代码中动态添加ListView的条目布局。条目简单的定义一个ImageView控件和一个TextView控件,水平放置。

<?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="horizontal">      <ImageView         android:id="@+id/image"        android:layout_width="wrap_content"        android:layout_height="40dp"        android:layout_weight="1"        />    <TextView         android:layout_width="wrap_content"        android:layout_height="40dp"        android:id="@+id/tv"        android:layout_weight="1"        /></LinearLayout>

最后一步就是在activity中实现ListView控件数据的添加,我将实现三种适配器数据的添加。首先第一种实现SimpleAdapter适配器。

package com.example.listviewtdw;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.AdapterView;import android.widget.ListView;import android.widget.SimpleAdapter;import android.widget.TextView;public class MainActivity extends Activity {private ListView lv;private TextView tv;private List<HashMap<String,Object>> data;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);lv = (ListView) this.findViewById(R.id.lv);tv = (TextView) this.findViewById(R.id.tv2);//** 为ListView添加数据适配器               data = new ArrayList<HashMap<String, Object>>();               for(int i=0;i<5;i++){HashMap<String, Object> map = new HashMap<String, Object>();map.put("image", R.drawable.a);map.put("desc", "tdw"+i);data.add(map);}SimpleAdapter sa = new SimpleAdapter(this, data, R.layout.listview_item, new String[]{"image","desc"}, new int[]{R.id.image,R.id.tv});lv.setAdapter(sa);lv.setOnItemClickListener(new OnItemClickListener());}private final class OnItemClickListener implements android.widget.AdapterView.OnItemClickListener{@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position,long id) {tv.setText("你选择了:"+data.get(position).get("desc"));}}}


SimpleAdapter的构造函数是:

public SimpleAdapter (Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)

context为上下文文本对象,

data为要往ListView添加的数据,它是一个List<Map<String,T>>集合,这里参照上边示例便于理解,

resource为要要添加数据的条目

String[] from为数据的提供者

int[] to为数据提供对应条目所在的数据

lv.setOnItemClickListener(new OnItemClickListener());该行为每个条目添加条目监听。

这是第一种数据适配器。


第二种适配器使用ArrayAdapter,

ArrayAdapter的构造函数是:

ArrayAdapter(Context context, int resource, int textViewResourceId, List<T> objects) 

context为上下文文本对象;

resource为要添加的条目对象

textViewResourceId为条目中textview控件的id。

objects可以为数据,也可以为集合

但是其默认每个条目中只能有一个textview控件,如果想实现多个控件的对应添加,可以继承ArrayAdapter重写其getView函数

package com.example.adpter;import java.util.List;import com.example.domain.Person;import com.example.listviewtdw.R;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ArrayAdapter;import android.widget.ImageView;import android.widget.TextView;public class MyArrayAdapter extends ArrayAdapter<Person>{private Context context;private List<Person> persons;private LayoutInflater inflater;private int resource;public MyArrayAdapter(Context context, int resource, List<Person> persons) {super(context, resource, persons);this.context = context;this.persons = persons;this.resource = resource;inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {View view = inflater.inflate(resource, null);ImageView imageView = (ImageView) view.findViewById(R.id.image);imageView.setBackgroundResource(persons.get(position).getId());TextView textView = (TextView) view.findViewById(R.id.tv);textView.setText(persons.get(position).getDesc());return view;}}


在getView(..)中,我们可以实现任何自己想要添加的控件的数据的绑定。可以参考上边的解释来解读这段代码.

这里给出部分代码,因为跟前面都是在一个工程之中。

       data = new ArrayList<Person>();       data.add(new Person(R.drawable.a,"android的创造者"));       data.add(new Person(R.drawable.b,"java的创造者"));       data.add(new Person(R.drawable.c,"关系数据库的创造者"));       data.add(new Person(R.drawable.d,"web开发的创造者"));              MyArrayAdapter sa = new MyArrayAdapter(this, R.layout.listview_item, data);      lv.setAdapter(sa);

这里绑定的是一个集合数据。

第三种适配器为继承BaseAdapter,BaseAdapter中文名为基础适配器,Spinner、ListView、GridView都有自己的适配器,但是BaseAdapter对他们来说是通用的,这里给出一个Demo.

package com.example.adpter;import java.util.HashMap;import java.util.List;import com.example.listviewtdw.R;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.TextView;public class MyAdapte extends BaseAdapter{private Context context;private List<HashMap<String, Object>> data;private LayoutInflater inflater;public MyAdapte(Context context, List<HashMap<String, Object>> data) {this.context = context;this.data = data;inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);}@Overridepublic int getCount() {return data.size();}@Overridepublic Object getItem(int position) {return data.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {View view = inflater.inflate(R.layout.listview_item, null);ImageView imageView = (ImageView) view.findViewById(R.id.image);TextView textView = (TextView) view.findViewById(R.id.tv);imageView.setImageResource((Integer) data.get(position).get("image"));textView.setText(data.get(position).get("desc").toString());return view;}}
其做法跟上边继承ArrayAdapter适配器类似,但是它更具有通用性,我这里就不给出全部代码了,自己可以编写一下。

适配器在项目中用到的频率较高,有必要好好掌握好。

1 0
原创粉丝点击