- 数据库介绍
sqlite
问:什么情况下使用数据库?
答:有大量相似结构的数据需要存储的时候 - 数据库的创建
定义一个类继承SqliteOpenHelper
context:上下文
name:数据库名字,如"test.db"
factory:目的创建cursor对象,游标(默认为null)
version:数据库版本,>=1
super(context,name,null,version) - 数据库的onCreate方法和onUpgrade方法
- 使用SQLite Expert Profession这个工具可以打开我们创建的数据库
- 需要提前安装这个数据库工具
- 使用sql语句对数据库进行增删改查
- 缺点
- Sql语句容易写错
- 执行sql语句没有返回值不容易判断
- 优点
- 容易进行多表查询
- 使用谷歌封装好的api对数据进行增删改查
- 优点
- 写法简单,不需要复杂的sql语句,不易写错
- 有返回值,方便开发
- 缺点:
如果有多张表,使用谷歌api不容易进行查询
- Android中数据库的事务的介绍
- 事务:执行一段逻辑,要么同时成功,要么同时失败。--银行转账的案例
- 事务步骤:
- db.beginTransition();
- db.setTransitionSuccessful();
- db.endTransition();
- listview
- ListView作用:Android系统中显示列表的控件
- 每一个ListView都可以包含很多列表项
ListView的显示与缓存机制
Recycler是View缓冲池
需要才显示,显示完被回收到缓存中 - 数据适配器
作用:把复杂的数据(数组,链表,数据库,集合等)填充到指定视图界面上,降低程序耦合性,容易扩展
- ArrayAdapter(数组适配器):用于绑定格式单一的数据
数据源:可以是集合或数组 - SimpleAdapter(简单适配器)
数据源:只能是特定泛型的集合 - 数据适配器是数据源和视图界面的桥梁
- 实现过程:新建适配器à添加数据源到适配器à视图加载适配器
- 监听器
- 作用:Android提供了很多事件监听器,监听器主要为了去响应某个动作。
- OnItemClickListener:可以处理视图中单个条目的点击事件
- OnScrollListener:检测滚动的变化,可以用于视图在滚动中加载数据
- 监听器是程序和用户(或系统)交互的桥梁
下面是数组适配器和简单适配器的用例:
MainActivity.java:
1 public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener, AbsListView.OnScrollListener {
2
3 private ArrayAdapter<String> arrayAdapter;
4 private SimpleAdapter simpleAdapter;
5 private ListView listView;
6 private List<Map<String, Object>> dataList;
7
8 @Override
9 protected void onCreate(Bundle savedInstanceState) {
10 super.onCreate(savedInstanceState);
11 setContentView(R.layout.activity_main);
12
13 listView = findViewById(R.id.listView);
14 /*数组适配器步骤:
15 String[] arr_data = {"数据1", "数据2", "数据3", "数据4", "数据5", "数据6", "数据7", "数据8", "数据9", "数据10"};
16 //1、新建一个数据适配器
17 //ArrayAdapter<String>(上下文,当前listView加载的每一个列表项所对应的布局文件,数据源)
18 //2、加载数据
19 arrayAdapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.item, arr_data);
20 //3、视图加载适配器
21 listView.setAdapter(arrayAdapter);
22 */
23
24 /**
25 *simpleAdapter = new SimpleAdapter(context,data,reaource,from,to);
26 *context:上下文
27 * data: 数据源(List<? extends Map<String,?>>data) 一个Map所 组成的List集合
28 * 每一个Map都会对应ListView列表的一行
29 * 每一个Map中的键必须包含所有在from所制定的键
30 * resource:列表项布局的ID
31 * from:Map中的键名
32 * to:绑定数据视图中的ID,与from成对应的关系
33 */
34 dataList = new ArrayList<Map<String, Object>>();
35 simpleAdapter = new SimpleAdapter(getApplicationContext(), getData(), R.layout.item, new String[]{"pic", "simpleText"}, new int[]{R.id.pic, R.id.simpleText});
36
37 //3、视图加载适配器
38 listView.setAdapter(simpleAdapter);
39 listView.setOnItemClickListener(this);
40 listView.setOnScrollListener(this);
41 }
42
43 private List<Map<String, Object>> getData() {
44 for (int i = 0; i < 20; i++) {
45 Map<String, Object> map = new HashMap<String, Object>();
46 map.put("pic", R.drawable.ic_launcher_foreground);
47 map.put("simpleText", "lalala" + i);
48 dataList.add(map);
49
50 }
51
52 return dataList;
53 }
54
55 @Override
56 public void onScrollStateChanged(AbsListView view, int scrollState) {
57 switch (scrollState) {
58 case SCROLL_STATE_FLING:
59 Log.i("Main", "用户在手指离开屏幕之前,由于用力滑动了一下,视图仍以靠惯性继续滑动");
60 Map<String,Object> map = new HashMap<String,Object>();
61 map.put("pic",R.drawable.ic_launcher_foreground);
62 map.put("simpleText","增加项");
63 dataList.add(map);
64 simpleAdapter.notifyDataSetChanged();
65 break;
66 case SCROLL_STATE_IDLE:
67 Log.i("Main", "试图以停止滑动");
68 break;
69 case SCROLL_STATE_TOUCH_SCROLL:
70 Log.i("Main", "手指没有离开屏幕,视图正在滑动");
71 break;
72
73 }
74 }
75
76 @Override
77 public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
78
79 }
80
81 @Override
82 public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
83 String text = listView.getItemAtPosition(position) + "";
84 Toast.makeText(getApplicationContext(), "position:" + position + "tetx:" + text, Toast.LENGTH_SHORT).show();
85 }
86 }
- View Code
Activity_main.xml:
1 <?xml version="1.0" encoding="utf-8"?>
2 <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 xmlns:tools="http://schemas.android.com/tools"
4 android:layout_width="match_parent"
5 android:layout_height="match_parent"
6 tools:context=".MainActivity">
7
8 <ListView
9 android:id="@+id/listView"
10 android:layout_width="match_parent"
11 android:layout_height="wrap_content">
12 </ListView>
13
14 </android.support.constraint.ConstraintLayout>
- View Code
Item.xml:
1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3
4 android:layout_width="match_parent"
5 android:layout_height="wrap_content"
6 android:orientation="horizontal">
7 <ImageView
8 android:id="@+id/pic"
9 android:layout_width="wrap_content"
10 android:layout_height="wrap_content"
11 android:layout_marginLeft="15dp"
12 android:src="@drawable/ic_launcher_foreground"/>
13 <TextView
14 android:id="@+id/simpleText"
15 android:layout_width="wrap_content"
16 android:layout_height="wrap_content"
17 android:textSize="20sp"
18 android:text="demo"/>
19
20 </LinearLayout>
- View Code
- 最通用的数据适配器——BaseAdapter,BaseAdapter基本结构
- public int getCount():适配器中数据集中数据的个数
- public Object getItem(int position):回去数据集中与指定索引对应的数据项
- public long getItemId(int position):回去制定对应的ID
- public View getView(int position, View convertView, ViewGroup parent):获取每一个Item的显示内容
下面是BaseAdapter用例:
item.xml:
1 <?xml version="1.0" encoding="utf-8"?>
2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="match_parent"
4 android:layout_height="wrap_content">
5 <ImageView
6 android:id="@+id/item_image"
7 android:layout_width="60dp"
8 android:layout_height="60dp" />
9 <TextView
10 android:id="@+id/item_title"
11 android:layout_width="match_parent"
12 android:layout_height="30dp"
13 android:layout_toEndOf="@+id/item_image"
14 android:text="Title"
15 android:gravity="center"
16 android:textSize="25sp"/>
17 <TextView
18 android:id="@+id/item_content"
19 android:layout_width="match_parent"
20 android:layout_height="30dp"
21 android:layout_toEndOf="@+id/item_image"
22 android:text="Content"
23 android:gravity="center_vertical"
24 android:textSize="25sp"/>
25
26 </RelativeLayout>
- View Code
ItemBean.java:
1 package com.lgqchinese.baseadaptertext;
2
3 public class ItemBean {
4 public int ImageImageResid;
5 public String ItemTitle;
6 public String ItemContent;
7
8 public ItemBean(int imageImageResid, String itemTitle, String itemContent) {
9 ImageImageResid = imageImageResid;
10 ItemTitle = itemTitle;
11 ItemContent = itemContent;
12 }
13 }
- View Code
Myadapter.java:
1 package com.lgqchinese.baseadaptertext;
2
3 import android.content.Context;
4 import android.view.LayoutInflater;
5 import android.view.View;
6 import android.view.ViewGroup;
7 import android.widget.BaseAdapter;
8 import android.widget.ImageView;
9 import android.widget.TextView;
10
11 import java.util.List;
12
13 public class MyAdapter extends BaseAdapter {
14 private List<ItemBean> myList;
15 private LayoutInflater myInflater;
16
17 public MyAdapter(Context context, List<ItemBean> list) {
18 myList = list;
19 //context:要使用当前的Adapter的界面对象
20 //myInflater:布局装载器对象
21 myInflater = LayoutInflater.from(context);
22 }
23
24 @Override
25 //返回ListView需要显示的数据数量
26 public int getCount() {
27 return myList.size();
28 }
29
30 //返回指定索引对应的数据项
31 @Override
32 public Object getItem(int position) {
33 return myList.get(position);
34 }
35
36 //返回对应的索引项
37 @Override
38 public long getItemId(int position) {
39 return position;
40 }
41
42 //返回每一项的显示内容
43 @Override
44 public View getView(int position, View convertView, ViewGroup parent) {
45 /*请勿模仿!!!!!!!!!!!!!!!
46 //有病,没有考虑缓存机制,造成对资源的极大浪费,效率极其低下
47 View view = myInflater.inflate(R.layout.item,null);
48 ImageView imageView = view.findViewById(R.id.item_image);
49 TextView tv_title = view.findViewById(R.id.item_title);
50 TextView tv_content = view.findViewById(R.id.item_content);
51 ItemBean bean = myList.get(position);
52 imageView.setImageResource(myList.get(position).ImageImageResid);
53 tv_title.setText(bean.ItemTitle);
54 tv_content.setText(bean.ItemContent);
55 return view;
56 !!!!!!!!!!!!!!!!!!!!*/
57 //普通式,入门
58 /*if (convertView == null) {
59 convertView = myInflater.inflate(R.layout.item, null);
60 }
61 ImageView imageView = convertView.findViewById(R.id.item_image);
62 TextView tv_title = convertView.findViewById(R.id.item_title);
63 TextView tv_content = convertView.findViewById(R.id.item_content);
64 ItemBean bean = myList.get(position);
65 imageView.setImageResource(bean.ImageImageResid);
66 tv_title.setText(bean.ItemTitle);
67 tv_content.setText(bean.ItemContent);
68 return convertView;*/
69 //普通式
70
71 //优化式
72
73 ViewHolder viewHolder;
74 if (convertView==null){
75 viewHolder=new ViewHolder();
76 convertView = myInflater.inflate(R.layout.item, null);
77 viewHolder.imageView=convertView.findViewById(R.id.item_image);
78 viewHolder.tv_title= convertView.findViewById(R.id.item_title);
79 viewHolder.tv_content=convertView.findViewById(R.id.item_content);
80 convertView.setTag(viewHolder);
81
82
83 }else {
84 viewHolder=(ViewHolder) convertView.getTag();
85 }
86 ItemBean bean = myList.get(position);
87 viewHolder.imageView.setImageResource(bean.ImageImageResid);
88 viewHolder.tv_title.setText(bean.ItemTitle);
89 viewHolder.tv_content.setText(bean.ItemContent);
90 return convertView;
91
92 // 优化式
93
94 }
95
96 class ViewHolder {
97 public ImageView imageView;
98 public TextView tv_title;
99 public TextView tv_content;
100 }
101 }
activity_main.xml:
1 <?xml version="1.0" encoding="utf-8"?>
2 <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 xmlns:app="http://schemas.android.com/apk/res-auto"
4 xmlns:tools="http://schemas.android.com/tools"
5 android:layout_width="match_parent"
6 android:layout_height="match_parent"
7 tools:context=".MainActivity">
8
9 <ListView
10 android:id="@+id/list_main"
11 android:layout_width="match_parent"
12 android:layout_height="match_parent"></ListView>
13
14 </android.support.constraint.ConstraintLayout>
- View Code
MainActivity.java:
1 package com.lgqchinese.baseadaptertext;
2
3 import android.support.v7.app.AppCompatActivity;
4 import android.os.Bundle;
5 import android.widget.ListView;
6
7 import java.util.ArrayList;
8 import java.util.List;
9
10 public class MainActivity extends AppCompatActivity {
11
12 @Override
13 protected void onCreate(Bundle savedInstanceState) {
14 super.onCreate(savedInstanceState);
15 setContentView(R.layout.activity_main);
16
17 List<ItemBean> itemBeanList = new ArrayList<>();
18 for (int i = 0;i<20;i++){
19 itemBeanList.add(new ItemBean(
20 R.drawable.ic_launcher_foreground,
21 "我是标题"+i,
22 "我是内容"+i
23 ));
24 }
25 ListView listView = findViewById(R.id.list_main);
26 listView.setAdapter(new MyAdapter(this,itemBeanList));
27 }
28 }
- View Code
- ListView显示数据的原理
mvc:
- Javaweb
m:mode,数据
v:view视图,用jsp
c:controller,用servlet - Android
m:mode数据(javabean)
v:view,用ListView
c:adaper
- 使用ListView高的时候使用填充父窗体(match…)
昔日我曾苍老,如今风华正茂(ง •̀_•́)ง