参考:https://www.bilibili.com/video/BV1fs411h7nF 视频做的笔记
文章目录1、用listview和BaseAdapter实现listView的入门1.1、布局文件1.2、MainActivity类2、listview的优化2.1、listview优化的原因:2.2、优化处理:3、listview显示复杂页面(在listview的一个item中显示图片和文字)3.1、activity_main.xml文件3.2、模板item.xml文件3.3、MainActivity 类4、获取打气筒的常用的api4.1、第一种4.2、第二种4.3、第三种5、ArrayAdapter的使用5.1、activity_main.xml文件5.2、item.xml文件5.3、MainActivity 文件6、SimpleAdapter的使用6.1、activity_main.xml文件6.2、MainActivity类7、将数据库中查询出的数据显示到listview中7.1、activity_main.xml文件7.2、item.xml文件7.3、MyOpenHelper类(数据库文件)7.4、MainActivity类8、BaseAdapter、SimpleAdapter、ArrayAdapter三者的区别 1、用listview和BaseAdapter实现listView的入门 在布局中定义listview控件 定义自己的适配器继承BaseAdapter 实现getCount和getView方法 1.1、布局文件
1.2、MainActivity类
package com.dsl.listView;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//找到相应的控件
ListView lv = (ListView) findViewById(R.id.lv);
//显示数据
lv.setAdapter(new MyListAdapter());
}
//定义listview适配器
private class MyListAdapter extends BaseAdapter{
//展示一共有多少条数据需要显示
@Override
public int getCount() {
return 100000000;
}
//返回指定position位置对应的对象
@Override
public Object getItem(int position) {
return null;
}
//返回position位置对应的id
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//创建新的view对象
TextView textView= new TextView(MainActivity.this);
textView.setText("嘻嘻嘻"+position);
return textView;
}
}
}
2、listview的优化
2.1、listview优化的原因:
在使用ListView控件的过程中,由于加载条目过多,在滑动时可能造成卡顿。这是因为ListView在当前屏幕有多少个条目,就会创建多少个对象,每一个条目都是一个对象。在滑动时,滑出屏幕的条目对象会被销毁,新加载到屏幕上的条目会创建新的对象,这样在ListView快速滑动时就会重复一个过程:【创建对象】–>【销毁对象】–>【创建对象】,并且每一个条目都需要加载一次布局,加载布局时会不断进行findViewById()操作初始化控件,而布局XML文件是以树形进行加载,每次加载一个条目都需要从根节点进行初始化,这样对内存消耗也比较大,并且浪费时间。为此就需要对ListView进行优化,优化的目的是在滑动时不会重复创建对象,减少内存消耗和屏幕渲染处理。
2.2、优化处理:
//将上面的getView方法可以替换为下面的代码进行优化
public View getView(int position, View convertView, ViewGroup parent) {
TextView textView;
if (convertView==null){
//创建新的view对象
textView = new TextView(MainActivity.this);
}else{
//复用历史缓存对象
textView = (TextView) convertView;
}
textView.setText("嘻嘻嘻嘻"+position);
return textView;
}
3、listview显示复杂页面(在listview的一个item中显示图片和文字)
在activity_main.xml布局文件中定义listview
定义要显示数据的模板布局文件
定义自己的适配器显示数据
3.1、activity_main.xml文件
3.2、模板item.xml文件
3.3、MainActivity 类
package com.dsl.listview3;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView lv = (ListView) findViewById(R.id.lv);
lv.setAdapter(new MyAdapter());
}
private class MyAdapter extends BaseAdapter{
@Override
public int getCount() {
return 7;
}
@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) {
View view;
if (convertView==null){
view = View.inflate(getApplication(), R.layout.item, null);
}else{
view = convertView;
}
return view;
}
}
}
4、获取打气筒的常用的api
4.1、第一种
View view = View.inflate(getApplication(), R.layout.item, null);
4.2、第二种
View view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.item, null);
4.3、第三种
LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.item, null);
5、ArrayAdapter的使用
在activity_main.xml文件定义listview控件
定义模板item.xml文件
通过适配器显示listview
5.1、activity_main.xml文件
5.2、item.xml文件
5.3、MainActivity 文件
package com.dsl.ArrayAdapter;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class MainActivity extends Activity {
String objects[] = {"一","二","三","四","五","六"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView lv = (ListView) findViewById(R.id.lv);
//创建一个arrayadapter
ArrayAdapter adapter = new ArrayAdapter(this, R.layout.item, R.id.tv, objects);
//设置数据适配器
lv.setAdapter(adapter);
}
}
6、SimpleAdapter的使用
6.1、activity_main.xml文件
6.2、MainActivity类
package com.dsl.simpleadapter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView lv = (ListView) findViewById(R.id.lv);
//准备listview要显示的数据
List<Map> data = new ArrayList();
Map map1 = new HashMap();
map1.put("name","鲁智深");
map1.put("phone","132546");
Map map2 = new HashMap();
map2.put("name","林冲");
map2.put("phone","1478");
Map map3 = new HashMap();
map3.put("name","张飞");
map3.put("phone","110");
Map map4 = new HashMap();
map4.put("name","赵云");
map4.put("phone","112");
Map map5 = new HashMap();
map5.put("name","关羽");
map5.put("phone","119");
//把map加入到集合中
data.add(map1);
data.add(map2);
data.add(map3);
data.add(map4);
data.add(map5);
SimpleAdapter simpleAdapter = new SimpleAdapter(getApplicationContext(), data, R.layout.item, new String[]{"name", "phone",}, new int[]{R.id.tv_name, R.id.tv_phone});
//设置数据适配器
lv.setAdapter(simpleAdapter);
}
}
7、将数据库中查询出的数据显示到listview中
在布局中添加listview、查询、添加等控件
定义模板文件item.xml
自定义类继承SQLiteOpenHelper实现创建数据库
自定义类继承BaseAdapter实现适配器的操作
写sql语句实现增加和查询
7.1、activity_main.xml文件
7.2、item.xml文件
7.3、MyOpenHelper类(数据库文件)
package com.dsl.SqlAndList;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class MyOpenHelper extends SQLiteOpenHelper {
public MyOpenHelper(Context context) {
super(context, "test.db", null, 5);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table info(_id integer primary key autoincrement,name varchar(20),phone varchar(20))");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
System.out.println("==========");
db.execSQL("alter table info add python varchar(20)");
}
}
7.4、MainActivity类
package com.dsl.SqlAndList;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends Activity {
private MyOpenHelper myOpenHelper;
List lists;
ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lists= new ArrayList();
lv = (ListView) findViewById(R.id.lv);
myOpenHelper = new MyOpenHelper(getApplicationContext());
}
public void add(View v){
//获得数据库对象
SQLiteDatabase db = myOpenHelper.getWritableDatabase();
//执行增加语句
// db.execSQL("insert into info(name,phone) values(?,?)",new Object[]{"李四","123456"});
ContentValues values = new ContentValues();
values.put("name","李四");
values.put("phone","120");
//返回值代表插入新行的id
long info = db.insert("info", null, values);
//数据库用完要关闭
db.close();
if(info>0){
Toast.makeText(getApplicationContext(),"添加成功",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(getApplicationContext(),"添加失败",Toast.LENGTH_SHORT).show();
}
}
public void query(View v){
SQLiteDatabase db = myOpenHelper.getWritableDatabase();
Cursor cursor = db.query("info",new String[]{"name", "phone"},null,null, null, null, null);
if (cursor!=null&&cursor.getCount()>0){
while(cursor.moveToNext()){
String name = cursor.getString(0);
String phone = cursor.getString(1);
//把数据封装到javabean中‘
Person p = new Person();
p.setName(name);
p.setPhone(phone);
lists.add(p);
}
//设置数据适配器
lv.setAdapter(new MyAdapter());
}
}
private class MyAdapter extends BaseAdapter{
@Override
public int getCount() {
return lists.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) {
View view;
if (convertView==null){
view = View.inflate(getApplicationContext(), R.layout.item, null);
}else{
view = convertView;
}
//找到控件用来显示数据
TextView name = (TextView)view.findViewById(R.id.tv_name);
TextView phone = (TextView) view.findViewById(R.id.tv_phone);
//如何显示数据
Person person = lists.get(position);
name.setText(person.getName());
phone.setText(person.getPhone());
return view;
}
}
}
8、BaseAdapter、SimpleAdapter、ArrayAdapter三者的区别
BaseAdapter:自定义的东西很多,可以做很多复杂的界面显示,更加灵活
SimpleAdapter:SimpleAdapter的扩展性最好,可以显示比较复杂的列表,包括每行显示图片、文字等,但不能对列表进行后期加工(在java代码中加工),也是只是单纯的负责显示.
ArrayAdapter:只可以简单的显示一行文本
作者:何渡?