ListView以及Adapter的用法

来源:互联网 发布:mac有淘宝吗 编辑:程序博客网 时间:2024/06/05 14:40

AdapterView具有如下属性:
继承了ViewGroup
可以包括多个列表项,并将多个列表项以合适的形式显示出来。
显示多个列表项,由Adapter提供。调用AdapterView的setAdapter(Adapter)
方法设置Adapter即可。

ListView和ListActivity
ListView的实现第一种方式:继承Activity
1)在布局文件中配置ListView的属性。
android:entries=”@array/courses”:设置显示数组数据,
android:divider=”#ff0000”:设置每项的分割条
android:dividerHeight=”2dp”:设置分割条的高度
其添加setOnItemClickListener(OnItemClickListener)事件
setOnItemLongClickListener(OnItemLongClickListener)事件
总结:使用数组创建ListView十分简单。
但这种方式能定制的内容很少,数据不灵活。 甚至连每个列表项的字号大小,颜色都不能改变。如果想对ListView的外观,行为进行定制,需要把ListView作为AdapterView使用,通过Adapter控制每项的外观和行为。

2)Adapter是一个接口,为列表提供数据和格式
常见了Adapter有:
ArrayAdapter:简单,易用的Adapter,通常用于将数组或List集合的多个值包装成多个列表项
SimpleAdapter:并不简单,功能强大的Adapter,可以用于将List集合的多个对象包装成多个列表项
SimpleCursorAdapter:与SimpleAdapter相似,只是用于包装Cursor提供的数据
BaseAdapter:通常用于被扩展,可以对各列表项进行最大限度的定制

3)在布局文件中配置ListView使用ArrayAdapter为其添加显示数据、配置不同布局方式。
下面的布局都是Android系统自带的:android.R.layout
simple_list_item_1:每项显示一个内容时
simple_list_item_single_choice:带有单选框的布局形式
需要结合ListView中的setChoiceMode(ListView.CHOICE_MODE_SINGLE);
simple_list_item_multiple_choice:带有多选框的布局形式
需要结合ListView中的setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
simple_list_item_checked:带有选择框的布局形式
也需要结合ListView中的setChoiceMode
总结:这种方式能够指定灵活的数据,但是界面比较单一,
每个列表项都是TextView组件。
也可以自定义布局文件,并且提供一个TextView组件.

4)SimpleAdapter,在布局文件中配置ListView
使用SimpleAdapter为其添加显示数据、实现自定义布局

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

第一个参数是Context,android上下文
第二个参数是List<? extends Map<String,?>>类型的集合对象,
该集合中每个Map<String,?>对象生成一个列表项
第三个参数是指定一个界面布局的ID。使用该界面作为列表项组件
第四个参数是一个String[]类型的参数,该参数决定提取Map<String,?>
对象中哪些key对应的value来生成列表项
第五个参数是一个int[]类型的参数,该参数决定填充哪些组件
总结:功能强大,可以实现更复杂的列表项。数据复杂。
但是只能显示本地图片,不能在线更新数据(如多个文件的下载进度)。

5)自定义Adapter适配器:extends BaseAdapter
BaseAdapter是所有适配器的基类
根据项目的情况提供自己需要的构造器

public MyAdapter(Context context,List<Map<String,Object>> list){}

//返回ListView中要显示的子View数量
//只需要返回构造方法中的list的条目就可以了

@Overridepublic int getCount() {    return this.list!=null?this.list.size():0;}

//返回一个子View,即ListView中的一个子条目显示数据的对象。
//也可以自定义返回你想要的信息

public Object getItem(int position) {    return this.list.get(position);}

//根据ListView中的位置返回适配器的位置。

public long getItemId(int position) {    return position;}

//返回这个条目的整个信息

public View getView(int position, View convertView, ViewGroup parent)           return convertView;}

6)ListView的实现另外一种方式:继承ListActivity
a)ListActivity默认布局中具有ListView,就可以不用指定布局文件。
然后调用setListAdapter为其指定适配器
也可以自定义布局方式,需要手动在布局文件中添加id为@android:id/list的ListView控件
b)然后调用setListAdapter为其指定适配器
android.R.layout.simple_list_item_2:显示两个文本框的布局
当ListView中的数据为空时,显示其他的组件,如下例:
指定该组件的id号为@android:id/empty

<TextView  android:id="@android:id/empty"             android:layout_width="wrap_content"        android:layout_height="wrap_content"            android:text="No items."/>

第一种:ArrayAdapter

package com.xspacing.listview;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.AdapterView.OnItemLongClickListener;import android.widget.ArrayAdapter;import android.widget.ListView;import android.widget.Toast;public class MainActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        ListView listView = (ListView) findViewById(R.id.listview);        final String array[] = { "遮天", "斗破苍穹", "完美世界", "大主宰" };        listView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, array));        listView.setOnItemClickListener(new OnItemClickListener() {            @Override            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {                Toast.makeText(getApplicationContext(), "点击" + array[position], 0).show();            }        });        listView.setOnItemLongClickListener(new OnItemLongClickListener() {            @Override            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {                Toast.makeText(getApplicationContext(), "长按了" + array[position], 0).show();                return true; // false长按不会消耗本次事件,会接着触发点击事件            }        });    }}
<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"    tools:context="com.xspacing.listview.MainActivity" >    <ListView        android:id="@+id/listview"        android:layout_width="match_parent"        android:layout_height="match_parent" /></RelativeLayout>

第二种:SimpleAdapter

package com.xspacing.listview;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.app.Activity;import android.os.Bundle;import android.widget.ListView;import android.widget.SimpleAdapter;public class MainActivity extends Activity {    private int[] mImageIds;    private String[] mNames;    private String[] mDescs;    private Map<String, Object> map;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        ListView listView = (ListView) findViewById(R.id.listview);        mImageIds = new int[] { R.drawable.a36, R.drawable.a37, R.drawable.a38, R.drawable.a39, R.drawable.a40 };        mNames = new String[] { "张三", "李四", "王五", "老李", "老王" };        mDescs = new String[] { "哈哈", "嘿嘿", "嘻嘻", "嘎嘎", "叽叽" };        SimpleAdapter mSimpleAdapter = new SimpleAdapter(this, getDatas(), R.layout.item_list_view,                new String[] { "mImageIds", "mNames", "mDescs" },                new int[] { R.id.main_img, R.id.main_tv_name, R.id.main_tv_desc });        listView.setAdapter(mSimpleAdapter);    }    public List<Map<String, Object>> getDatas() {        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();        for (int i = 0; i < mNames.length; i++) {            map = new HashMap<String, Object>();            map.put("mImageIds", mImageIds[i]);            map.put("mNames", mNames[i]);            map.put("mDescs", mDescs[i]);            list.add(map);        }        return list;    }}

布局文件同上

第三种:BaseAdapter

package com.xspacing.slidelistview;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.content.Context;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.AdapterView;import android.widget.AdapterView.OnItemLongClickListener;import android.widget.ListView;public class MainActivity extends Activity {    private Context mContext;    private ListView mListView;    private MyBaseAdapter adapter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mListView = (ListView) findViewById(R.id.main_list_view);        mContext = this;        final List<Student> list = new ArrayList<Student>();        // 添加假数据        for (int i = 0; i < 20; i++) {            Student student = new Student();            if (i % 2 == 0) {                student.name = i + ".阳澄湖大闸蟹";                student.desc = "9月23日正式开湖";                student.reId = R.drawable.a25;            } else {                student.name = i + ".特大新闻";                student.desc = "上海将举行xxx的演唱会";                student.reId = R.drawable.a26;            }            list.add(student);        }        adapter = new MyBaseAdapter(list, mContext);        mListView.setAdapter(adapter);        mListView.setOnItemLongClickListener(new OnItemLongClickListener() {            @Override            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {                list.remove(position);                adapter.notifyDataSetChanged();                return true;            }        });        mListView.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {            }        });    }}
package com.xspacing.slidelistview;public class Student {    public String name; //标题    public int reId; //图片    public String desc;//描述    public Student(String name, String desc,int reId) {        this.name = name;        this.desc = desc;        this.reId=reId;    }    public Student() {    }}
package com.xspacing.slidelistview;import java.util.List;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.ListAdapter;import android.widget.TextView;public class MyBaseAdapter extends BaseAdapter implements ListAdapter {    List<Student> list;    Context mContext;    public MyBaseAdapter(List<Student> list, Context mContext) {        this.list = list;        this.mContext = mContext;    }    @Override    public int getCount() {        return list.size();    }    @Override    public Object getItem(int position) {        return list.get(position);    }    @Override    public long getItemId(int position) {        return position;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        ViewHolder holder = null;        // 是否复用        if (convertView == null) {            convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list_view, parent, false);            holder = new ViewHolder();            holder.mImageView = (ImageView) convertView.findViewById(R.id.main_img);            holder.mTextVieName = (TextView) convertView.findViewById(R.id.main_tv_name);            holder.mTextDesc = (TextView) convertView.findViewById(R.id.main_tv_desc);            // 设置tag            convertView.setTag(holder);        } else {            holder = (ViewHolder) convertView.getTag();        }        holder.mImageView.setImageResource(list.get(position).reId);        holder.mTextVieName.setText(list.get(position).name);        holder.mTextDesc.setText(list.get(position).desc);        return convertView;    }    class ViewHolder {        ImageView mImageView;        TextView mTextVieName;        TextView mTextDesc;    }}
<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"    tools:context="com.xspacing.slidelistview.MainActivity" >    <ListView        android:id="@+id/main_list_view"        android:layout_width="match_parent"        android:layout_height="match_parent" >    </ListView></RelativeLayout>
<?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="80dp"    android:layout_margin="10dp"     android:gravity="center_vertical">    <ImageView        android:id="@+id/main_img"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:src="@drawable/ic_launcher" />    <LinearLayout        android:layout_width="match_parent"        android:layout_height="match_parent"        android:layout_weight="1"        android:gravity="center"        android:orientation="vertical"        android:padding="5dp" >        <TextView            android:id="@+id/main_tv_name"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:text="第一个textview"            android:textSize="17sp"            android:textStyle="bold" />        <TextView            android:id="@+id/main_tv_desc"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:layout_marginTop="2dp"            android:text="第二个textview" />    </LinearLayout></LinearLayout>
0 0
原创粉丝点击