Android UI高级控件之SimpleAdapter

来源:互联网 发布:java中的接口和抽象类 编辑:程序博客网 时间:2024/05/16 07:23

 在ArrayAdapter中,数据源一般是数组,而在SimpleAdapter中,数据源是List<Map<String,Object>>,这里不再对一些定义进行描述,根据下面的例子,我相信可以更好得掌握它的用法。

一.构造函数:public SimpleAdapter (Context context, List<?extends Map<String, ?>> data, int resource, String[] from, int[] to);第一个参数:上下文对象;第二个参数:数据源,第三个参数:适配器控件中每个条目对应的布局文件;第四个参数:数据源中Map集合中的key的集合;

第五个参数:布局文件中控件Id的集合。

二.我们还是以ListView和SimpleAdapter为例,了解它的用法;

1.在布局文件中添加一个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_persons"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/textView1"
        android:layout_toRightOf="@+id/textView1" >
    </ListView>


</RelativeLayout>

2.由于这里使用SimpleAdapter,而它的第三个参数是需要一个布局文件,这个布局文件指定了他每个条目的样式,所以,在res下的layout中新建一个布局文件,名为layout_item,并设置某些属性,代码如下:

<?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"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_marginRight="106dp"
        android:layout_marginTop="15dp"
        android:text="姓名" />

    <TextView
        android:id="@+id/textView_age"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView_name"
        android:layout_below="@+id/imageView_head"
        android:text="年龄" />

    <ImageView
        android:id="@+id/imageView_head"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/textView_name"
        android:layout_marginLeft="31dp"
        android:src="@drawable/ic_launcher" />

   

</RelativeLayout>

3.给ListView中添加数据,用setAdapter(),并添加点击事件,这在里,我们根据它的提示,需要什么,我们就给它什么,所有的代码如下:

public class MainActivity extends Activity {

    private List<Map<String,Object>> data;//声明数据源,并在getData()方法中给它赋值
    private ListView listView01;
    private SimpleAdapter adapter=null;//声明SimpleAdapter。
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        data=getData();
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView01=(ListView) findViewById(R.id.listView_persons);
        adapter=getAdapter();//为了代码结构清晰,所以提取成一个方法
        listView01.setAdapter(adapter);//给ListView中添加数据,这里需要一个Adapter,所以我们new一个Adapter
        listView01.setOnItemClickListener(new OnItemClickListener() {

            @Override
            /**
             * 添加点击事件
             * @param parent:事件源,当前的适配器控件;
             * @param view:当前的条目,用户点击了哪个条目,哪个就是view
             * @param position:当前条目的索引号
             * @param id:当前条目多对应的行数
             * @param
             */

            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                //1.根据数据源获取数据
                /*Map<String, Object> map=data.get(position);
                String name=map.get("name").toString();*/
                //2.根据适配器对象获取数据
                //String name=((Map<String,Object>)adapter.getItem(position)).get("name").toString();
                //3.根据适配器控件获取
                //String name=((Map<String,Object>)parent.getItemAtPosition(position)).get("name").toString();
                //4.根据形参view获取
                TextView tv=(TextView) view.findViewById(R.id.textView_name);
                String name=tv.getText().toString();
                Toast.makeText(getApplicationContext(), "name="+name, Toast.LENGTH_SHORT).show();
                
            }
        });
    }


    private List<Map<String, Object>> getData() {
        data=new ArrayList<Map<String,Object>>();
        /**
         * 在drawable文件夹中的图片,由于名字是按顺序的,所以在R文件中生成的id也是有规律的,每次都加1,
         * 所以可以用for循环,添加到Map集合中

         */
        for(int i=0;i<6;i++){
            Map<String,Object> maps=new HashMap<String,Object>();
            maps.put("header",R.drawable.tou1+i );
            maps.put("name","张三"+i);
            maps.put("age",21+i);
            data.add(maps);
        }
        return data;
    }
    /**
     *
     * @return
     */
    private SimpleAdapter getAdapter() {
        adapter=new SimpleAdapter(this, //上下文对象
                data, //数据源
                R.layout.activity_layout,//当前控件中每个条目对应的布局文件
                new String[]{"header","name","age"}, //数据源中Map集合中的Key值的集合
                new int[]{R.id.imageView_head,R.id.textView_name,R.id.textView_age});//当前控件中每个条目对应的布局文件中控件的id的集合
        return adapter;
    }

}

4.完成后,运行效果如下:如果做到这一步,说明最基本的用法已经掌握了,随着以后和其他知识的结合,慢慢的就融会贯通了!


0 0
原创粉丝点击