1.简单介绍ListView
listview是一个以垂直方式在项目中显示视图的列表。是一种不能实现确定视图中的内容的适配器视图(adapter view)。数据和视图的绑定,需要通过继承ListViewAdapter接口的适配器实现。确保当上下滚动的时候,能够动态刷新视图内容。通常我们都会自定义一个继承自BaseAdapter(已继承ListViewAdapter),ArrayAdapter(继承自BaseAdapter),SimpleAdapter(继承自BaseAdapter)的类,重写getView()方法,实现自己想要的功能。
getView方法详情
inflate(int, android.view.ViewGroup, boolean)
AdapterView
AdapterView
Adapter
Adapter
AdapterView
Adapter
AdapterView
适配器支持的常见布局包括:
使用数据填充适配器视图
AdapterView
实例与 Adapter
绑定来填充 AdapterView
(如 ListView
或 GridView
),此操作会从外部来源检索数据,并创建表示每个数据条目的 View
。
Android 提供了几个 Adapter
子类,用于检索不同种类的数据和构建 AdapterView
的视图。 两种最常见的适配器是:ArrayAdapter和SimpleCursorAdapter。
2.ListView使用步骤
1).在布局的XML文件中,添加如下代码:
<ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
2)新建list_item的布局文件,确定每一个View的样式。
3).新建一个适配器类。
4).绑定数据到视图。
3.使用实例
1).使用ArrayAdapter
主layout文件:
mylistview.xml文件
<?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"
>
<ListView
android:id="@+id/mylistview"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
</ListView>
</LinearLayout>
list_item的xml文件:
list_item.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="18sp"
>
</TextView>
activity文件:
MyActivity.java文件
public class MyActivity extends Activity{
private ListView listview;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.mylistview);
listview = (ListView)findViewById(R.id.mylistview);
String[] str = {"上海","北京","天津","江苏","河南","西藏","新疆","湖南","湖北"};
List<String> listdata = new ArrayList<String>();
listdata.add("上海");
listdata.add("北京");
listdata.add("天津");
listdata.add("江苏");
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,R.layout.list_item,listdata);//listdata和str均可
listview.setAdapter(arrayAdapter);
}
}
2.使用SimpleAdapter
构造方法:SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)
simpleAdapter可以通过hashmap的方式,每个view可以显示几种不同的内容。
1).主layout文件和上面相同
2).list_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"
>
<ImageView
android:id="@+id/iv1"
android:layout_width="30dp"
android:layout_height="30dp"
android:src="@drawable/ic_launcher"
/>
<TextView
android:id="@+id/tv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:text="wgj"
android:layout_toRightOf="@id/iv1"
>
</TextView>
<TextView
android:id="@+id/tv2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:text="19岁"
android:layout_below="@id/tv1"
android:layout_toRightOf="@id/iv1"
>
</TextView>
</RelativeLayout>
3.activity文件
public class MyActivity extends Activity{
private ListView listview;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.mylistview);
listview = (ListView)findViewById(R.id.mylistview);
SimpleAdapter simpleAdapter = new SimpleAdapter(this,putData(),R.layout.list_item,
new String[]{"name","age","pic"},new int[]{R.id.tv1,R.id.tv2,R.id.iv1});
listview.setAdapter(simpleAdapter);
}
public List<Map<String,Object>> putData(){
List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
Map<String,Object> map1 = new HashMap<String,Object>();
map1.put("name", "张三");
map1.put("age", "19岁");
map1.put("pic", R.drawable.friend);
Map<String,Object> map2 = new HashMap<String,Object>();
map2.put("name", "李四");
map2.put("age", "17岁");
map2.put("pic", R.drawable.ic_launcher);
Map<String,Object> map3 = new HashMap<String,Object>();
map3.put("name", "王五");
map3.put("age", "17岁");
map3.put("pic", R.drawable.ic_launcher);
list.add(map1);
list.add(map2);
list.add(map3);
return list;
}
}
3.使用BaseAdapter
优化方法 convertView 重用对象
3.1.通过缓存convertView实现
- 这种利用缓存contentView的方式可以判断如果缓存中不存在View才创建View,如果已经存在可以利用缓存中的View,提升了性能
3.2.通过convertView+ViewHolder来实现
-ViewHolder就是一个静态类,使用 ViewHolder 的关键好处是缓存了显示数据的视图(View),加快了 UI 的响应速度。
-代码中,当convertView为空时,用setTag()方法为每个View绑定一个存放控件的ViewHolder对象。当convertView不为空,重复利用已经创建的view的时候,使用getTag()方法获取绑定的ViewHolder对象,这样就避免了findViewById对控件的层层查询,而是快速定位到控件。
3.3Adapter文件
public class MyAdapter extends BaseAdapter{
private LayoutInflater mInflater;
private List<Map<String,Object>> list;
public MyAdapter(Context context , List<Map<String,Object>> list){
this.mInflater = LayoutInflater.from(context);
this.list = list;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return list.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.list_item, null);
holder.name = (TextView)convertView.findViewById(R.id.tv1);
holder.age = (TextView)convertView.findViewById(R.id.tv2);
holder.pic = (ImageView)convertView.findViewById(R.id.iv1);
convertView.setTag(holder);
}else{
holder = (ViewHolder)convertView.getTag();
}
holder.name.setText((String)list.get(position).get("name"));
holder.age.setText((String)list.get(position).get("age"));
holder.pic.setBackgroundResource((Integer)list.get(position).get("pic"));
return convertView;
}
public final class ViewHolder{
public TextView name;
public TextView age;
public ImageView pic;
}
}
3.4 Activity文件
public class MyActivity extends Activity{
private ListView listview;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.mylistview);
listview = (ListView)findViewById(R.id.mylistview);
MyAdapter myAdapter = new MyAdapter(this,putData());
listview.setAdapter(myAdapter);
}
public List<Map<String,Object>> putData(){
List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
Map<String,Object> map1 = new HashMap<String,Object>();
map1.put("name", "张三");
map1.put("age", "19岁");
map1.put("pic", R.drawable.friend);
Map<String,Object> map2 = new HashMap<String,Object>();
map2.put("name", "李四");
map2.put("age", "17岁");
map2.put("pic", R.drawable.ic_launcher);
Map<String,Object> map3 = new HashMap<String,Object>();
map3.put("name", "王五");
map3.put("age", "17岁");
map3.put("pic", R.drawable.ic_launcher);
list.add(map1);
list.add(map2);
list.add(map3);
return list;
}
}