ListView(列表视图)
使用步骤
- 在布局xml文件声明listview控件
- 在java代码找到listview控件设置数据适配器,继承BaseAdapter
- getCount()确定listview里面有多少个条目
- getView(int position) 返回某个位置要显示的view对象
- View.inflate() 打气筒 可以把xml文件转成view显示
ListView视图控件
列表信息很多时候,滑动起来很慢,这时listview有个属性
android:fastScrollEnabled="true"//快速滑动
适配器.:就是把一些数据在View上显示。可以看作是界面数据绑定的一种理解。它所操纵的数据一般都是一些比较复杂的数据,如数组,链表, 数据库,集合等
常用适配器 ArrayAdapter ,SimpleAdapter 他们都是继承于 BaseAdapter
一般对于前两个适配器,他们的数据来源无非就是String[]或者List 。下面我们列举两个例子:
ArrayAdapter(数组适配器)作为纯文本,单一内容时使用。List
例一,数组作为数据源,填充的是ArrayAdapter
private ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lv);
String[] objects = new String[]{"Animation","App","content","Media","NFC","OS"};// 传入字符串内容
lv.setAdapter(new ArrayAdapter<String>(this, // 赋值 ArrayAdapter定义泛型<String>(参数1:context,
R.layout.item,//参数2:自定义布局,
objects)); //参数3:String[]数组内容);
}
SimpleAdapter()作为图片和文本时使用,List
例二:List作为数据源,填充的是SimpleAdapter
private ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lv);
List<Map<String, Object>> data = new ArrayList<Map<String,Object>>();// List<Map<String,Object>>,进行图片文字显示
Map<String, Object> map1 = new HashMap<String, Object>();// 在ListView显示一行内容
map1.put("icon", R.drawable.ic_menu_preferences);
// 绑定图片
map1.put("name", "功能设置");
// 绑定文字内容
data.add(map1);
// 添加到List集合里
Map<String, Object> map2 = new HashMap<String, Object>();
map2.put("icon", R.drawable.ic_menu_recent_history);
map2.put("name", "时钟设置");
data.add(map2);
// 赋值 SimpleAdapter (参数1:context,参数2:自定义布局,参数3:);
lv.setAdapter(new SimpleAdapter(this,
// 赋值 SimpleAdapter (参数1:context,
data, // 参数2:List<Map<String,Object>>名
R.layout.item,
// 参数3:自定义布局
new String[]{"icon","name"},
// 参数4:String[]里放入 Map的key键
new int[]{R.id.iv,R.id.tv}));
// 参数5:int[]里放入 自定义布局里的控件 ImageView 和 TextView
}
BaseAdapter(基础适配器)以下是自定义适配器继承 BaseAdapter
// 设置适配器
private class MyAdapter extends BaseAdapter {
// 获取listView所要显示的次数
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
// 获得在listView所要显示的内容
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// 此块代码是写入到 XML中 LinearLayout,代码创建布局属性;LinearLayout显示数据有限,数据一旦过多就奔溃
LinearLayout ll = new LinearLayout(MainActivity.this);
ll.setOrientation(LinearLayout.HORIZONTAL);
ll.setGravity(Gravity.CENTER_VERTICAL);
ImageView iv = new ImageView(MainActivity.this);
String sex = list.get(position).getSex();
if ("man".equals(sex)) {
iv.setImageResource(R.mipmap.ic_launcher);
} else {
iv.setImageResource(R.mipmap.ic_launcher);
}
TextView tv = new TextView(MainActivity.this);
tv.setText(list.get(position).getName());
ll.addView(iv,50,50);
ll.addView(tv);
return ll;
}
});
// 如果条目多,快速滑动,会出现内存溢出,这时需要复用listView缓存对象(convertView),把用过的条目复用回收
TextView tv = null;
if (convertView == null) { // 缓存不存在就创建
ll = new TextView(MainActivity.this);
} else { // 存在的话就进行复用回收
ll = (TextView) convertView;
}
// View.inflate() 打气筒 可以把xml文件转成view显示,获取控件在liteView里显示
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// 用 ListView 显示数据
View view = null;
if (convertView == null) {
// 打气把 item.xml 打气到view
view = View.inflate(MainActivity.this, R.layout.item, null);
} else {
view = convertView;
}
// findViewById,前面记得要指明是 View.findViewById() 否则默认是MainActivity.findViewById(),获取控件信息会出错
ImageView image = (ImageView) view.findViewById(R.id.item_image);
TextView text = (TextView) view.findViewById(R.id.item_text);
Student student = list.get(position);
String sex = student.getSex();
if ("man".equals(sex)) {
image.setImageResource(R.mipmap.nan);
} else {
image.setImageResource(R.mipmap.nv);
}
text.setText(student.getName());
return view;
}
adapter.notifyDataSetChanged(); // 通知数据适配器更新数据,而不是new出来新的数据适配器
例子:
//获取数据库的全部记录,刷新显示数据
private void refreshData() {
list = sql.findAdd();
if (adapter == null) {
adapter = new MyAdapter();
lv.setAdapter(adapter);
} else {
// 通知数据适配器更新数据,而不是new出来新的数据适配器
adapter.notifyDataSetChanged();
}
}