一、ListView入门
1.在布局中定义ListView控件
android:scrollbars="vertical" //不可拖动的垂直滚动条
android:fastScrollEnabled="true" //可拖动的垂直滚动条
2.定义ListView的数据适配器(BaseAdapter)
3.实现 BaseAdapter 的 getCount() 和 getView() 方法
private class MyListView extends BaseAdapter{
@Override
public int getCount() { //共有多少条数据需要显示
return 1000;
}
@Override
public Object getItem(int i) { //返回指定position位置对应的对象
return null;
}
@Override
public long getItemId(int i) { //返回指定position位置对应的id
return 0;
}
//获取一个view,用来显示listview的数据,会作为listview的一个条目出现
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
TextView tv = new TextView(MainActivity.this);
tv.setText("哈哈"+i);
return tv;
}
}
4.找到组件并显示
ListView lv = (ListView) findViewById(R.id.lv_listView);
lv.setAdapter(new MyListView());
二、ListView 优化
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
TextView tv;
if(view == null){ //view为历史缓存对象
tv = new TextView(MainActivity.this); //如果没有历史缓存对象,创建新的
}else {
tv = (TextView)view; //如果有,复用
}
tv.setText("哈哈"+i);
return tv;
}
三、ListView 显示数据的原理
mvc:
m:mode 数据(用javabean封装)
v:view 视图(ListView)
c:adapter 适配器
四、ListView 的奇怪现象
1.当LIstView 控件高度改为包括内容大小时,适配器中打印输出了很多次
System.out.println("hhhh哈哈"+i); //改大小之后打印次数为原来的多倍
2.原因:当控件高度改为包括内容大小时,Android会“多次校验”可以不可以在屏幕中完全显示所有内容。
3. 之后再使用ListView控件是,高度设为填充父窗体。
五、打气筒的介绍
1.定义一个布局,左边图片,右上标题,右下内容
2.定义ListView 控件
3.通过打气筒把布局资源转换成一个view对象
public View getView(int i, View view, ViewGroup viewGroup) {
View v;
if (view == null){
/*
第一个参数:上下文
第二个参数:就是我们定义的布局文件
*/
v = View.inflate(MainActivity.this,R.layout.item,null); //通过打气筒把布局资源转换成一个view对象
}else {
v = view;
}
return v;
}
4.找到并显示组件
六、获取打气筒常用api
//第一种
v = v.inflate(MainActivity.this,R.layout.item,null);
//第二种
v = LayoutInflater.from(getApplicationContext()).inflate(R.layout.item,null);
//第三种
LayoutInflater layoutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
v = layoutInflater.inflate(R.layout.item,null);
七、数组适配器介绍(ArrayAdapter)
public class MainActivity extends AppCompatActivity {
String objects[] = {"老王","老李","老刘","老张"}; //先定义一个要显示的数组
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView lv = findViewById(R.id.lv); //找到listview控件
//创建一个arrayadapter
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.item,R.id.tv,objects);
lv.setAdapter(adapter); //设置数据适配器
}
}
八、权重
1.用法
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1" //与下面控件平分大小 占二分之一
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
2.只在线性布局中使用
九、SimpleAdapter
List<Map<String ,String >> data = new ArrayList<Map<String, String>>(); //提前准备的data数据
Map<String ,String > map1 = new HashMap<>(); //集合的泛型为Map,创建一个Map对象
map1.put("name","张三"); //存入数据
map1.put("phone","1388888");
Map<String ,String > map2 = new HashMap<>();
map2.put("name","李四");
map2.put("phone","1399999");
Map<String ,String > map3 = new HashMap<>();
map3.put("name","王五");
map3.put("phone","110");
data.add(map1); //将Map对象放到集合中
data.add(map2);
data.add(map3);
SimpleAdapter adapter = new SimpleAdapter( //五个参数
getApplicationContext(), //上下文
data, //数据:List< Map<String,String> >,数据要提前准备
R.layout.item, //布局文件
new String[]{"name","phone"}, //map集合中的键
new int[]{R.id.tv_name,R.id.tv_phone});//显示到哪,显示数据的控件id
十、把数据库的数据展示到ListView上
1.在数据库中查询时把查询到的数据封装到 javabean 中(建一个Person类,name,phone两个属性,生成getter、setter方法)
2.一个人的数据为一个Person对象,分别存到集合中(List<Person> lp = new ArrayList<Person>() )
while (cursor.moveToNext()){
String name = cursor.getString(1);
String phone = cursor.getString(2);
Person p = new Person();
p.setName(name);
p.setPhone(phone);
lp.add(p);
}
3.新建ListView控件,集合的大小就是getCount()方法中需要显示数据的个数
@Override
public int getCount() {
return lp.size();
}
4.定义用来显示的数据
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
View v;
if(view == null){
v = View.inflate(getApplicationContext(),R.layout.item,null);
}else {
v = view;
}
TextView tv_name = v.findViewById(R.id.tv_name); //获取item布局中的控件
TextView tv_phone = v.findViewById(R.id.tv_phone);
Person p = lp.get(i); //在集合中获取对象
tv_name.setText(p.getName()); //对象的属性显示在控件中
tv_phone.setText(p.getPhone());
return v;
}
5.点击查询时,再点击事件中调用显示ListView的方法
lv.setAdapter(new Myadapter());