步步为营_Android开发课[19]_用户界面之ListView(列表视图)

来源:互联网 发布:启用MIUI优化 编辑:程序博客网 时间:2024/05/29 03:18

Focus on technology, enjoy life!—— QQ:804212028
浏览链接:http://blog.csdn.net/y18334702058/article/details/44624305


  • 主题:用户界面之ListView(列表视图)
    -ListView和TextView,Button等控件一样,一样的定义方式。但是Android开发中说道ListView就不得不说Adapter适配器,因为只有通过Adapter才可以把列表中的数据映射到ListView中。

创建一个ListView需要3个元素

(1)ListView中的每一列的View。
(2)填入View的数据或者图片等。
(3)连接数据与ListView的适配器。

常用适配器

Adapter 含义 ArrayAdapter 用来绑定一个数组,支持泛型操作 SimpleAdapter 用来绑定在xml中定义的控件对应的数据 SimpleCursorAdapter 用来绑定游标得到的数据 BaseAdapter 通用的基础适配器

ListView结合ArrayAdapter适配器使用

activity_main.xml源代码:

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

MainActivity.java源代码:

import android.app.Activity;import android.os.Bundle;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 ListView listView;    String[] str= new String[]{"aa","bb","cc","dd","ee"};    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        listView = (ListView)findViewById(R.id.listView);        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, str);;        //上面android.R.layout.simple_list_item_1是系统自带的一种ListView布局方式        listView.setAdapter(adapter);        listView.setOnItemClickListener(new OnItemClickListener(){            @Override            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,                    long arg3) {                // TODO Auto-generated method stub                Toast.makeText(MainActivity.this, "你点击的是"+arg2, Toast.LENGTH_LONG).show();            }                   });    }}

运行结果:

这里写图片描述

ListView结合SimpleAdapter适配器使用

难道我们只满足在列表中只展示几个文字吗?我们向更加漂亮点,我们想在列表中加入图片。这时候使用SimpleAdapter的时候到了。SimpleAdapter的使用也非常简单,同时它的功能也非常强大。可以通过它自定义ListView中的item(item就是列表每一行的显示)的内容,比如图片、多选框等。看一个例子,实现一个每一行都有一个ImageView和TextView的ListView。

activity_main.xml源代码:

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

定义一个item的显示布局,也就是列表每一行怎么显示,来看源代码
item.xml源代码:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent">    <ImageView        android:id="@+id/ItemImage"        android:layout_alignParentRight="true"         android:layout_width="wrap_content"        android:layout_height="wrap_content" />     <TextView        android:id="@+id/ItemTitle"         android:layout_height="wrap_content"         android:layout_width="fill_parent"         android:textColor="#336699"        android:textSize="20sp"/>     <TextView         android:id="@+id/ItemText"          android:layout_height="wrap_content"         android:layout_width="fill_parent"         android:textColor="#336699"        android:layout_below="@+id/ItemTitle"/> </RelativeLayout>

MainActivity.java源代码:

import java.util.ArrayList;import java.util.HashMap;import android.app.Activity;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;import android.widget.Toast;public class MainActivity extends Activity {    private ListView listView;    private String[] mListTitle = { "姓名", "性别", "年龄", "居住地","邮箱"};      private String[] mListStr = { "aa","bb","cc","dd","ee" };    /*或者用这个,因为Map是个接口,HashMap是它的实现类           List<Map<String, Object>> listdata = new ArrayList<Map<String,Object>>();       for(int i=0; i<images.length; i++){           Map<String, Object> map = new HashMap<String, Object>();           map.put("myinfo", info[i]);           map.put("myimages", images[i]);           listdata.add(map);       }       SimpleAdapter adapter = new SimpleAdapter(this, listdata, R.layout.list, new String[] {"myinfo", "myimages"} , new int[] {               R.id.myinfo, R.id.myimages });        lv.setAdapter(adapter);    */    ArrayList<HashMap<String, Object>> itemData = new ArrayList<HashMap<String,Object>>();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        listView = (ListView)findViewById(R.id.listView);        for(int i=0;i<mListTitle.length;i++){            HashMap<String,Object> item = new HashMap<String,Object>();            item.put("image", R.drawable.myimage);              item.put("title", mListTitle[i]);              item.put("text", mListStr[i]);              itemData.add(item);          }        SimpleAdapter adapter = new SimpleAdapter(this, itemData, R.layout.item, new String[] {"image"                ,"title", "text"}, new int[] {R.id.ItemImage,R.id.ItemTitle,R.id.ItemText});        listView.setAdapter(adapter);        listView.setOnItemClickListener(new OnItemClickListener(){            @Override            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,                    long arg3) {                // TODO Auto-generated method stub                Toast.makeText(MainActivity.this, "你点击的是"+arg2, Toast.LENGTH_LONG).show();            }                   });    }}

运行结果:

这里写图片描述

ListView结合BaseAdapter适配器使用

其实开发中最常用的还是BaseAdapter,尽管使用起来比其他适配器有些麻烦,但是使用它却能实现很多自己喜欢的列表布局,比如ListView、GridView、Gallery、Spinner等。它是直接继承自接口类Adapter的,使用BaseAdapter时需要重写很多方法,其中最重要的当属getView。

activity_main.xml源代码:

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

item.xml源代码:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent">    <ImageView        android:id="@+id/ItemImage"        android:layout_alignParentLeft="true"         android:layout_width="wrap_content"        android:layout_height="wrap_content" />     <TextView        android:id="@+id/ItemTitle"         android:layout_height="wrap_content"         android:layout_width="fill_parent"         android:layout_toRightOf="@id/ItemImage"        android:textColor="#336699"        android:textSize="20sp"/>     <TextView         android:id="@+id/ItemText"          android:layout_height="wrap_content"         android:layout_width="fill_parent"         android:layout_toRightOf="@id/ItemImage"        android:textColor="#336699"        android:layout_below="@+id/ItemTitle"/>      <Button         android:id="@+id/ItemButton"        android:layout_alignParentRight="true"         android:layout_width="wrap_content"        android:layout_height="wrap_content" /></RelativeLayout>

MainActivity.java源代码:

import java.util.ArrayList;import java.util.HashMap;import android.app.Activity;import android.content.Context;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.BaseAdapter;import android.widget.Button;import android.widget.ImageView;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends Activity {    private ListView listView;    private ArrayList<HashMap<String, Object>> data;    private String[] mListTitle = { "姓名", "性别", "年龄", "居住地","邮箱"};      private String[] mListStr = { "aa","bb","cc","dd","ee" };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //获取将要绑定的数据设置到data中        data = getData();        listView = (ListView)findViewById(R.id.listView);        MyAdapter adapter = new MyAdapter(this);        listView.setAdapter(adapter);            }    private ArrayList<HashMap<String, Object>> getData(){         ArrayList<HashMap<String, Object>> itemDate = new ArrayList<HashMap<String,Object>>();        /**为动态数组添加数据*/            for(int i=0;i<mListTitle.length;i++){        HashMap<String,Object> item = new HashMap<String,Object>();           item.put("ItemImage", R.drawable.myimage);             item.put("ItemTitle", mListTitle[i]);             item.put("ItemText", mListStr[i]);             itemDate.add(item);         }        return itemDate;    }    private class MyAdapter extends BaseAdapter{    private LayoutInflater mInflater;    public MyAdapter(Context context){        this.mInflater = LayoutInflater.from(context);    }    @Override    public int getCount() {        // TODO Auto-generated method stub        return getData().size();//返回列表的行数    }    @Override    public Object getItem(int arg0) {        // TODO Auto-generated method stub        return null;    }    @Override    public long getItemId(int arg0) {        // TODO Auto-generated method stub        return 0;    }    @Override    public View getView(final int position, View convertView, ViewGroup parent) {        // TODO Auto-generated method stub        ViewHolder holder;        if(convertView == null){            holder = new ViewHolder();            convertView = mInflater.inflate(R.layout.item, null);            holder.imageView = (ImageView)convertView.findViewById(R.id.ItemImage);            holder.title = (TextView)convertView.findViewById(R.id.ItemTitle);            holder.text = (TextView)convertView.findViewById(R.id.ItemText);            holder.bt = (Button)convertView.findViewById(R.id.ItemButton);            //将设置好的布局保存到缓存中,并将其设置在Tag里,以便后面方便取出Tag            convertView.setTag(holder);        }        else{            holder = (ViewHolder)convertView.getTag();        }        /**设置TextView显示的内容,即我们存放在动态数组中的数据*/                    holder.title.setText((String)data.get(position).get("ItemTitle"));        holder.text.setText((String)data.get(position).get("ItemText"));        holder.imageView.setImageResource((Integer)data.get(position).get("ItemImage"));        /**为Button添加点击事件*/                     holder.bt.setOnClickListener(new OnClickListener() {            public void onClick(View v) {                Toast.makeText(MainActivity.this, "你点击了---"+ position +"---按钮", Toast.LENGTH_LONG).show();            }        });        return convertView;        }    }    public final class ViewHolder{        public TextView title;        public TextView text;        public Button   bt;        public ImageView imageView;    }}

运行结果:

这里写图片描述

Focus on technology, enjoy life!—— QQ:804212028
浏览链接:http://blog.csdn.net/y18334702058/article/details/44624305

1 0