ListView与适配器
ListView 是标准的MVC写法:
M modle 数据模型 List<Person>
V view 视图 ListView
C controller 控制器 Adapter
1. BaseAdapter是适配器的基础类,自定义适配器一般都继承自该类,在上节的基础上创建一个ListView:
<ListView
android:id="@+id/lv"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
再创建一个流式布局的xml文件,用于ListView中选项数据的展示:
<TextView
android:id="@+id/tv_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dip"
android:text="id"
android:textColor="#ff0000"
android:textSize="20sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="60dip"
android:layout_margin="20dip"
android:gravity="center_vertical"
android:orientation="vertical" >
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dip"
android:text="姓名"
android:textColor="#000000"
android:textSize="18sp" />
<TextView
android:id="@+id/tv_phone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dip"
android:text="电话"
android:textColor="#880000"
android:textSize="16sp" />
</LinearLayout>
接下来再创建一个继承自BaseAdapter适配器类:
//默认实现类 simpleXXX efaultXXX baseXXX
private class MyAdapter extends BaseAdapter{
private static final String TAG = "MyAdapter";
/**
*控制listview里面总共有多少个条目
*/
@Override
public int getCount() {
return persons.size();//条目个数 == 集合的size
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Log.i(TAG, "返回view对象,位置:"+position);
//得到某个位置对应的person对象
Person person = persons.get(position);
View view = View.inflate(MainActivity.this, R.layout.list_item, null);
//一定要在view对象里面寻找孩子的id
TextView tv_id = (TextView) view.findViewById(R.id.tv_id);
tv_id.setText("id:" + person.getId());
TextView tv_name = (TextView) view.findViewById(R.id.tv_name);
tv_name.setText("姓名:" + person.getName());
TextView tv_phone = (TextView) view.findViewById(R.id.tv_phone);
tv_phone.setText("电话:" + person.getNumber());
return view;
}
}
最后在onCreate方法中设置适配器即可:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
PersonDao dao = new PersonDao(MainActivity.this);
persons = dao.findAll();
lv = (ListView) findViewById(R.id.lv);
lv.setAdapter(new MyAdapter());
}
2. ArrayAdapter是继承自BaseAdapter中最简单的适配器,只能用于基本的数据填充:
同理创建一个有ListView控件的布局,接下来在创建ListView选项布局:
<ImageView
android:id="@+id/iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher"/>
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:text="aaaaaaaaa"
android:layout_height="wrap_content"/>
接下来在MainActivity中定义一个数组用于填充适配器的数据,再设置适配器即可:
private static String[] names = { "功能1", "功能2", "功能3" };
private ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lv);
lv.setAdapter(new ArrayAdapter<String>(this, R.layout.list_item,
R.id.tv, names));
}
3. SimpleAdapter也是继承自BaseAdapter并以键值对填充的适配器,用户处理比较复杂的选项布局:
与上面同理,先创建ListView组件,在创建一个选项布局:
<ImageView
android:id="@+id/iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
接下来即可在MainActivity类中操作:
ListView lv = findViewById(R.id.lv);
List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();
Map<String, Object> map1 = new HashMap<String, Object>();
map1.put("nametext", "我是第一个功能");
map1.put("iconid", R.drawable.arrow_up_float);
Map<String, Object> map2 = new HashMap<String, Object>();
map2.put("nametext", "我是第二个功能");
map2.put("iconid", R.drawable.alert_light_frame);
Map<String, Object> map3 = new HashMap<String, Object>();
map3.put("nametext", "我是第三个功能");
map3.put("iconid", R.drawable.bottom_bar);
data.add(map1);
data.add(map2);
data.add(map3);
//data 绑定的数据。 list集合
//R.layout.list_item, 数据显示对应的布局
//要让数据跟view 对象建立一个映射关系
//from[] map集合里面数据的key
//to[] 布局文件里面的 id
lv.setAdapter(new SimpleAdapter(this, data, R.layout.list_item,
new String[] { "nametext", "iconid" }, new int[] { R.id.tv,
R.id.iv }));
}