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的条目就可以了
@Override
public 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>