1. Listview的入门
listview是一个垂直滚动的列表. 可以展示一些条目 每个条目长得都查不多.
代码实现过程
1.在布局中声明listview
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="itheima.day05.MainActivity">
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"></ListView>
</RelativeLayout>
2.listview里面展示的是一个条目一个条目的内容 每个条目的内容来自listAdapter 由于listAdapter默认实现地方法特别多,所以我们找到了listadapter的实现类---->baseAdapter,所以定义一个类继承BaseAdapter就可以了
class MyAdapter extends BaseAdapter {
//listview一共需要展示多少个条目
@Override
public int getCount() {
return 100;
}
//根据position(索引)可以找到对应的条目
@Override
public Object getItem(int position) {
return null;
}
//根据position找到对应条目的id值
@Override
public long getItemId(int position) {
return 0;
}
//获取一个view 负责每个条目具体展示的内容
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView textView = new TextView(MainActivity.this);
textView.setTextSize(24);
textView.setText("传智播客");
return textView;
}
}
3.listview和适配器关联
lv.setAdapter(new MyAdapter());
2.listview优化
@Override
public View getView(int position, View convertView, ViewGroup parent) {
///1.判断一下converview
TextView textView ;
if (convertView == null){
textView = new TextView(MainActivity.this);
System.out.println("创建新的view对象:"+textView);
}else{
//说明这个对象不为空
textView = (TextView) convertView;
System.out.println("复用旧的对象:"+textView);
}
textView.setTextSize(22);
textView.setText("传智播客"+position);
return textView;
}
}
3.复杂listview效果制作
1.把要展示的listview效果通过布局做出来
<?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/iv_icon"
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@drawable/bg"
/>
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="今日头条"
android:textSize="30sp"
android:textColor="#000000"
android:layout_marginLeft="5dp"
android:layout_marginTop="5dp"
android:layout_toRightOf="@id/iv_icon"
/>
<TextView
android:id="@+id/tv_desc"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="今日头条老师老师过来过时了阿拉嘎嘎嘎"
android:textSize="20sp"
android:textColor="#999999"
android:layout_marginLeft="5dp"
android:layout_marginTop="5dp"
android:layout_toRightOf="@id/iv_icon"
android:layout_below="@id/tv_title"
/>
</RelativeLayout>
2.通过View类提供的打气筒服务把一个布局转换为View
View view = View.inflate(MainActivity.this, R.layout.item, null);
4.获取打气筒服务常见写法
1.通过View类提供的一个静态方法获取打气筒服务
view = View.inflate(MainActivity.this, R.layout.item, null);
2.通过布局填充器类获取打气筒服务
view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item,null);
3.通过getsystemservice方法获取打气筒服务
LayoutInflater layoutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
view = layoutInflater.inflate(R.layout.item,null);
5.综合小案例(把数据库真实数据通过listview展示数据)
代码实现步骤
5.1先声明listview
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"></ListView>
5.2 当点击查询按钮的时候 把数据封装到集合
{
//1. 第一次是创建数据库 第二次调用就是打开数据库
SQLiteDatabase db = myOpenHelper.getWritableDatabase();
//2.执行一个插入的sql语句 当执行查询sql语句的时候不能使用execSQL方法 因为这个方法返回值是void
// Cursor cursor = db.rawQuery("select * from info", null); id name phone
/**
* 参数1:表名
* 参数2 :代表要查询的列 new String[]{"id","name","phone"} null什么也不写就不知道要查什么 默认查所有
* 参数3:查询条件 没有查询条件 ?
* 参数4: 对条件占位
* 参数5:group by 分组 不分组
* 参数6:having null
*/
Cursor cursor = db.query("info", null, null, null, null, null, null, null);
//3.移动光标把数据取出来
if (cursor!=null){
while (cursor.moveToNext()){
//4.取出对应列的值 列的索引 从0开始
// int id = cursor.getInt(0);
String id = cursor.getString(0);
String name = cursor.getString(1);
String phone = cursor.getString(2);
//5.创建一个bean对象 用来存查询信息
Person person = new Person();
person.setName(name);
person.setPhone(phone);
//6.把person对象加入到list集合
lists.add(person);
}
//7.listview和适配器关联
lv.setAdapter(new MyAdapter());
}
//3.当db对象用完后 需要关闭
db.close();
}
5.3创建listview适配器对象
//定义listview的适配器
class MyAdapter extends BaseAdapter{
//展示listview一共有几个条目 应该是查询出来几个数据就展示几个
@Override
public int getCount() {
return lists.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
//获取一个view 用来展示每个条目的内容 1.手动创建一个view 2.通过打气筒把一个布局转换为一个view对象
@Override
public View getView(int position, View convertView, ViewGroup parent){
//1.取集合里面取数据
Person person = lists.get(position);
//2.通过打气筒把item转换为一个view对象
View view ;
if (convertView == null){
view = View.inflate(MainActivity2.this,R.layout.item,null);
}else{
view = convertView;
}
//3.把集合里面的数据展示出来 先到控件 眼睛看见的不一定真实的.神偷 报这个错的原因不赖你们 懒谷歌
TextView tv_name = (TextView) view.findViewById(R.id.tv_name);
TextView tv_phone = (TextView) view.findViewById(R.id.tv_phone);
//4.更新数据 说明textview为空
tv_name.setText(person.getName());
tv_phone.setText(person.getPhone());
return view;
}
}
6.ArrayAdapter的使用
不管什么adapter 功能都是一样的.功能就是adapter负责把数据展示到listview上
arrayAdapter的使用
String objects[] = {"android","java","c","html","servler","jsp"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1.找到lv
ListView lv = (ListView) findViewById(R.id.lv);
//2.给lv设置数据适配器 参数2:布局资源---->条目的布局资源--->到底画成什么样 看listview具体要展示什么数据.
//参数3:条目里面的控件的id
lv.setAdapter(new ArrayAdapter<String>(this,R.layout.item,R.id.tv,objects));
// lv.setAdapter(new SimpleAdapter());
// lv.setAdapter(new MyAdapter());
}