Android studio蓝牙项目list view完成报告(LEDAPP)
(实验一(能够测试且实现功能的代码))
时间:2020.11.12
一、需实现的功能(2020.10.29):
1.点击发送,内容显示到list view的最上面一行中,并且存入sqlite数据库。
2.长按list view中的某一行,弹出是否删除,是则删除并刷新list view,否不执行任何操作。单击list view中的某一行,获取这一行的数据到EditTest输入框内,可以进行编辑。
3.每次打开APP,数据按照最后输入的顺序显示在list view中。
二、用到的技术和环境(2020.10.30):
2.1 sqlite数据库的增删改查操作;
2.2 list view的长按事件与单击事件;
2.3 基于Androidstudio3.2 ,windows10,grade4.6。
三、技术和编写代码(2020.10.31-2020.11.11)**
3.1 sqlite介绍
SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库不一样,您不需要在系统中配置。就像其他数据库,SQLite 引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接。SQLite 直接访问其存储文件。与关系数据库进行交互的标准 SQLite 命令类似于 SQL。
3.2 sqlite操作
命令包括 CREATE、SELECT、INSERT、UPDATE、DELETE 和 DROP。
3.3 sqlite程序代码
创建一个MyDatabaseHelper类,继承自SQLiteOpenHelper。MyDatabaseHelper作为一个访问sqlite的助手类,提供两个方面的功能
1.getReadableDatabase(),getWriteableDatabase(), 可以获得sqliteDatabase对象。
2.提供了onCreate()和onUpgrade()两个回调函数,允许我们在创建和升级数据库时,进行自己的操作。
//在SQLiteOpenHelper的子类当中,必须有该构造函数。
public MyDatabaseHelper(Context context){
//必须通过super调用父类中的构造函数
super(context,“dict.db”,null,1);//重写构造方法并设置工厂为null
}
在onCreate()中创建表:
db.execSQL(CREATE_TABLE_SQL);
final String CREATE_TABLE_SQL = “create table dict(_id integer primary key autoincrement,word varchar(10)))”;//第一个是id,自增长的。第二个是键值。
插入操作:
readableDatabase.insert(“dict”,null,values);//执行插入操作 values为值
删除操作:
db.delete(“dict”, “word=?”, new String[]{title});
查询操作:
Cursor cursor = dbOpenHelper.getReadableDatabase().query(“dict”, null, null, null, null, null, null);//查询所有
Cursor cursor = dbOpenHelper.getReadableDatabase().query(“dict”, null, “word=?”, new String[]{key}, null, null, null);//关键词查询
3.4 list view介绍
List view是Android中常用的控件,主要能够实现上下滚动效果。ListView是一个视图组,显示可滚动项的列表。使用可以从列表(Adapter例如数组或数据库查询)中获取内容,并将每个项目结果转换为放置在列表中的视图,该列表项会自动插入列表中。
在这里我用的是simpleadapter 来生成listView。这个是用到最多的。这个和其他的组件有点不同,那就是这个组件,我们一般会写一个模板来做。这个模板在附录result_main.xml中,主要作用是list view中每一行的布局,此程序使用线性布局。
SimpleAdapter 这个就是listview装载数据的一个类,会有5个参数,第一个是上下文,第二个是它的数据源这个数据源我们一般用List<Map<String, String>> 这个格式。第三个就是我们的模板,第4个是我们的List<Map<String, String>> 中map的key 第五个是我们模板要放数据的位置的id 必须是和第4个参数一一对应,这样我们的数据也能相应的放对位置。这个做完,我们就把模板,数据,一一对应的着到的位置,放在了SimpleAdapter中。接下来就是我们要和主布局的listview进行绑定。
SimpleAdapter simpleAdapter = new SimpleAdapter(MainActivity.this, resultList, R.layout.result_main,new String[]{“word”}, new int[]{R.id.result_word });
listView.setAdapter(simpleAdapter);
3.5 list view单击事件
//此是list view的单击事件,能够获取item的值和id。
//此处可以作为实现 点击列表中某一项,显示到编辑框的功能。
//2020.11.09 17:04
listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
@Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
//获得选中项的HashMap对象
HashMap<String,String> map=(HashMap<String,String>)listView.getItemAtPosition(arg2);
String title=map.get("word");
String content=map.get("interpret");
etSearch.setText(title);//item值显示到编辑框中
Toast.makeText(getApplicationContext(),
"你选择了第"+arg2+"个Item,itemTitle的值是:"+title+" "+"itemContent的值是:"+content,
Toast.LENGTH_SHORT).show();
}
});
3.6 list view长按事件
/**
* 2020 11 11 20 02 此方法是长按删除
* 里面是逆序排列
* 然后加入了查询所有
* 进而每次长按删除后都能够执行查询命令,实现刷新功能
*/
private AdapterView.OnItemLongClickListener listViewItemLongClickListener=new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1, final int arg2,
long arg3) {
new AlertDialog.Builder(MainActivity.this).setTitle("提醒").setMessage("您确定要删除该项吗").setNegativeButton("取消", null).setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
final ListView listView = (ListView) findViewById(R.id.list);
HashMap<String,String> map=(HashMap<String,String>)listView.getItemAtPosition(arg2);
String title=map.get("word");
db.delete("dict", "word=?", new String[]{title}); //删除之前定义的key
Toast.makeText(MainActivity.this, "删除成功", Toast.LENGTH_LONG).show();
// final ListView listView = (ListView) findViewById(R.id.list);
Cursor cursor = dbOpenHelper.getReadableDatabase().query("dict", null, null, null, null, null, null);
//创建ArrayList对象,用于保存查询输出的结果
ArrayList<Map<String, String>> resultList = new ArrayList<Map<String, String>>();// 创建一个结果集 两个String类型
while (cursor.moveToNext()) {
//用while循环一直判断,当下一条为假时,我们的游标循环也就结束了
//cursor.movetonext 定义一个游标 它的作用是将游标向下挪动一位 判断当前游标位置的下一条还有没有数据 如果有 就返回真 如果无 就返回假
Map<String, String> map1 = new HashMap<>(); //新开辟一个map的集合空间
map1.put("word", cursor.getString(1));//在第一行输出姓名
map1.put("interpret", cursor.getString(2));//在第二行输出电话
int n=0;
resultList.add(n,map1);
n++;
}
if (resultList == null || resultList.size() == 0) {
Toast.makeText(MainActivity.this, "没有相关记录", Toast.LENGTH_LONG).show();
} else {
//定义一个simpleAdapter,供列表项使用
SimpleAdapter simpleAdapter = new SimpleAdapter(MainActivity.this, resultList, R.layout.result_main,
new String[]{"word", "interpret"}, new int[]{
R.id.result_word, R.id.result_interpret});
listView.setAdapter(simpleAdapter);
}
refreshListView();
}
}).show();
return true; //如果是true操作系统执行的反馈(震动或者声音) 如果是false 则不触发
}
};
四、 遇到问题和解决方案(2020.11.12)
4.1 list view逆序显示问题
问题:list view每次插入都会在列表的最后面,我们需要的功能是在第一个,使用的函数是add(map)。
提出了三种方案:一是尝试cursor逆序读取,显示到list view中;二是HashMap先顺序排列,然后倒序排列;三是使用add(n,map),其中n定义初值为0,然后n++;
解决:在尝试前两种方案的过程中,偶然发现使用第三种方案也可以解决,第三种方案只是在显示的时候更改了顺序,实则在数据库中的ID和列表的ID是相反的。这样造成的后果就是长按删除的时候列表中删除第一个会在数据库中删除最后一个。原来使用长按删除是根据ID删除的。这个问题的解决方案是:利用list view的单击事件获取被长按项的值,然后紧接着在后面直接利用数据库中的删除方法进行删除,这样就解决了长按删除的BUG。
4.2 list view长按删除后刷新问题
问题:list view长按删除后列表项并没有刷新,refreshListView()函数只是在数据库中刷新了,并没有在item中刷新。
解决方案:在删除命令执行完毕之后紧接着执行数据库的查询命令,这样就可以实现长按删除后刷新功能。
五、附录:代码
5.1 MyDatabaseHelper.java
package jscsd.sqlitedatabasetwo;
/*
MyDatabaseHelper作为一个访问sqlite的助手类,提供两个方面的功能
1.getReadableDatabase(),getWriteableDatabase(), 可以获得sqliteDatabase对象。
2.提供了onCreate()和onUpgrade()两个回调函数,允许我们在创建和升级数据库时,进行自己的操作。
*/
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class MyDatabaseHelper extends SQLiteOpenHelper {
//这里面有三个参数
/*
第一个是id 主键,它是自动增长的
第二个与第三个是我们定义的两个数据 姓名 电话
*/
final String CREATE_TABLE_SQL = "create table dict(_id integer primary key autoincrement,word varchar(5),detail varchar(11))";
//在SQLiteOpenHelper的子类当中,必须有该构造函数。
public MyDatabaseHelper(Context context){
//必须通过super调用父类中的构造函数
super(context,"dict.db",null,1);//重写构造方法并设置工厂为null
}
@Override
//该函数在第一次创建数据库时执行
public void onCreate(SQLiteDatabase db){
//execSQL用于执行SQL语句
/*
怎么预置数据呢
我们现在有两种方式,
1.用studiosqlite新建数据库,然后把表导入到我们的手机上 暂时还没有实现
2.在代码里面直接写入 如下
*/
db.execSQL(CREATE_TABLE_SQL);//创建单词信息表
db.execSQL("insert into dict(word,detail) values(?,?)",new String[]{"张SIT","10000000"});
db.execSQL("insert into dict(word,detail) values(?,?)",new String[]{"田","10000005"});
}
@Override
//重写基类的onUpgrade()方法,以便数据库版本更新
public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
//提示版本更新并输出旧版本与新版本信息
System.out.println("---版本更新---"+oldVersion+"--->"+newVersion);
}
}
5.2 MainActivity.java
package jscsd.sqlitedatabasetwo;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Menu;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.view.View;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MainActivity extends Activity {
private MyDatabaseHelper dbOpenHelper;//定义DBOpenHelper
private SQLiteDatabase dbRead,dbWrite;
private SimpleCursorAdapter adapter;
/*
创建AlertDialog的步骤:
1、创建AlertDialog.Builder对象
2、调用Builder对象的setTitle方法设置标题,setIcon方法设置图标
3、调用Builder相关方法如setMessage方法、setItems方法、setSingleChoiceItems方法、setMultiChoiceItems方法、setAdapter方法、setView方法设置不同类型的对话框内容。
4、调用setPositiveButton、setNegativeButton、setNeutralButton设置多个按钮
5、调用Builder对象的create()方法创建AlertDialog对象
6、调用AlertDialog对象的show()方法将对话框显示出来
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbOpenHelper = new MyDatabaseHelper(this);
SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
final ListView listView = (ListView) findViewById(R.id.list);
final EditText etSearch = (EditText) findViewById(R.id.search_et);
Button btnSearch = (Button) findViewById(R.id.search_btn);
Button btnSearch_bit = (Button) findViewById(R.id.search_btn_bit);
Button btn_add = (Button) findViewById(R.id.btn_add);
Button btn_delete = (Button) findViewById(R.id.btn_delete);
//触发方法的实现 长按触发删除某一行
dbRead = dbOpenHelper.getReadableDatabase();
dbWrite = dbOpenHelper.getWritableDatabase();
adapter = new SimpleCursorAdapter(this, R.layout.result_main, null, new String[]{"word", "detail"}, new int[]{R.id.result_word, R.id.result_interpret});
refreshListView();
listView.setOnItemLongClickListener(listViewItemLongClickListener);
// String key = etSearch.getText().toString();//获取要查询的姓名
//query("user",new String[]{"id","name"},"id=?",new String[]{"1"},null,null,null)
Cursor cursor = dbOpenHelper.getReadableDatabase().query("dict", null, null, null, null, null, null);
//创建ArrayList对象,用于保存查询输出的结果
ArrayList<Map<String, String>> resultList = new ArrayList<Map<String, String>>();// 创建一个结果集 两个String类型
while (cursor.moveToNext()) {
//用while循环一直判断,当下一条为假时,我们的游标循环也就结束了
//cursor.movetonext 定义一个游标 它的作用是将游标向下挪动一位 判断当前游标位置的下一条还有没有数据 如果有 就返回真 如果无 就返回假
Map<String, String> map = new HashMap<>(); //新开辟一个map的集合空间
map.put("word", cursor.getString(1));//在第一行输出姓名
map.put("interpret", cursor.getString(2));//在第二行输出电话
//resultList.add(map);//在XML文件resultList 显示
int n=0;
resultList.add(n,map);
n++;
}
if (resultList == null || resultList.size() == 0) {
Toast.makeText(MainActivity.this, "没有相关记录", Toast.LENGTH_LONG).show();
} else {
//定义一个simpleAdapter,供列表项使用
SimpleAdapter simpleAdapter = new SimpleAdapter(MainActivity.this, resultList, R.layout.result_main,
new String[]{"word", "interpret"}, new int[]{
R.id.result_word, R.id.result_interpret});
listView.setAdapter(simpleAdapter);
}
//删除的实现
//方法:
// 1.假如要删除所有的,把条件和后面的置为空。
// 2.假如要删除指定的某一个,即加入占位符,后面的把要删除的某一行写上。
// 3.假如要删除其中的某个咋们输入的自己的数,则先用getTest().toString()方法获取到输入的数据,然后在后面调用,即可。
btn_delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//获得数据库的写操作,并声明db,以便用于手续的sql语句操作
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
//定义key,获得输入框输入的数据,便于后续的删除操作
String key = etSearch.getText().toString();
//此处一定注意
// 我们在判断是否相等时,数字方面的用==,而字符与字符串必须要用equals方法
if (key.equals("")) {
Toast.makeText(MainActivity.this, "没有可删除的数据", Toast.LENGTH_LONG).show();
} else {
//db.delete("dict","nulll",null); 这句话是删除表中的所有的数据
db.delete("dict", "word=?", new String[]{key}); //删除之前定义的key
Toast.makeText(MainActivity.this, "删除成功", Toast.LENGTH_LONG).show();
}
}
});
//跳转界面用 Intent实现,这是通用的一种方式。
btn_add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String key = etSearch.getText().toString();
insertData(dbOpenHelper.getReadableDatabase(),key);
refreshListView();
Toast.makeText(MainActivity.this, "发送且保存成功", Toast.LENGTH_LONG).show();
//Intent intent = new Intent(MainActivity.this, AddActivity.class);
//通过Intent跳转添加生词界面
//startActivity(intent);
// String key = etSearch.getText().toString();//获取要查询的姓名
//query("user",new String[]{"id","name"},"id=?",new String[]{"1"},null,null,null)
Cursor cursor = dbOpenHelper.getReadableDatabase().query("dict", null, null, null, null, null, null);
//创建ArrayList对象,用于保存查询输出的结果
ArrayList<Map<String, String>> resultList = new ArrayList<Map<String, String>>();// 创建一个结果集 两个String类型
while (cursor.moveToNext()) {
//用while循环一直判断,当下一条为假时,我们的游标循环也就结束了
//cursor.movetonext 定义一个游标 它的作用是将游标向下挪动一位 判断当前游标位置的下一条还有没有数据 如果有 就返回真 如果无 就返回假
Map<String, String> map = new HashMap<>(); //新开辟一个map的集合空间
map.put("word", cursor.getString(1));//在第一行输出姓名
map.put("interpret", cursor.getString(2));//在第二行输出电话
//resultList.add(map);//在XML文件resultList 显示
int n=0;
resultList.add(n,map);
n++;
}
if (resultList == null || resultList.size() == 0) {
Toast.makeText(MainActivity.this, "没有相关记录", Toast.LENGTH_LONG).show();
} else {
//定义一个simpleAdapter,供列表项使用
SimpleAdapter simpleAdapter = new SimpleAdapter(MainActivity.this, resultList, R.layout.result_main,
new String[]{"word", "interpret"}, new int[]{
R.id.result_word, R.id.result_interpret});
listView.setAdapter(simpleAdapter);
}
}
});
//查询其中的某一个,
btnSearch_bit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String key = etSearch.getText().toString();//获取要查询的姓名
//query("user",new String[]{"id","name"},"id=?",new String[]{"1"},null,null,null)
Cursor cursor = dbOpenHelper.getReadableDatabase().query("dict", null, "word=?", new String[]{key}, null, null, null);
//创建ArrayList对象,用于保存查询输出的结果
ArrayList<Map<String, String>> resultList = new ArrayList<Map<String, String>>();// 创建一个结果集 两个String类型
while (cursor.moveToNext()) {
//用while循环一直判断,当下一条为假时,我们的游标循环也就结束了
//cursor.movetonext 定义一个游标 它的作用是将游标向下挪动一位 判断当前游标位置的下一条还有没有数据 如果有 就返回真 如果无 就返回假
Map<String, String> map = new HashMap<>(); //新开辟一个map的集合空间
// map.put("id",cursor.getString(0));
map.put("word", cursor.getString(1));//在第一行输出姓名
map.put("interpret", cursor.getString(2));//在第二行输出电话
resultList.add(map);//在XML文件resultList 显示
}
if (resultList == null || resultList.size() == 0) {
Toast.makeText(MainActivity.this, "查无此人", Toast.LENGTH_LONG).show();
} else {
//定义一个simpleAdapter,供列表项使用
SimpleAdapter simpleAdapter = new SimpleAdapter(MainActivity.this, resultList, R.layout.result_main,
new String[]{"word", "interpret"}, new int[]{
R.id.result_word});
listView.setAdapter(simpleAdapter);
}
}
});
//查询所有的
btnSearch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// String key = etSearch.getText().toString();//获取要查询的姓名
//query("user",new String[]{"id","name"},"id=?",new String[]{"1"},null,null,null)
Cursor cursor = dbOpenHelper.getReadableDatabase().query("dict", null, null, null, null, null, null);
//创建ArrayList对象,用于保存查询输出的结果
ArrayList<Map<String, String>> resultList = new ArrayList<Map<String, String>>();// 创建一个结果集 两个String类型
while (cursor.moveToNext()) {
//用while循环一直判断,当下一条为假时,我们的游标循环也就结束了
//cursor.movetonext 定义一个游标 它的作用是将游标向下挪动一位 判断当前游标位置的下一条还有没有数据 如果有 就返回真 如果无 就返回假
Map<String, String> map = new HashMap<>(); //新开辟一个map的集合空间
map.put("word", cursor.getString(1));//在第一行输出姓名
map.put("interpret", cursor.getString(2));//在第二行输出电话
int n=0;
resultList.add(n,map);
n++;
}
if (resultList == null || resultList.size() == 0) {
Toast.makeText(MainActivity.this, "没有相关记录", Toast.LENGTH_LONG).show();
} else {
//定义一个simpleAdapter,供列表项使用
SimpleAdapter simpleAdapter = new SimpleAdapter(MainActivity.this, resultList, R.layout.result_main,
new String[]{"word", "interpret"}, new int[]{
R.id.result_word, R.id.result_interpret});
listView.setAdapter(simpleAdapter);
}
}
});
//重大突破 可以获取列表ID,也可以获取值。
//此是list view的事件,可以应用在长按事件的删除操作中
//此处可以作为实现 点击列表中某一项,显示到编辑框的功能。
//2020.11.09 17:04
listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
@Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
//获得选中项的HashMap对象
HashMap<String,String> map=(HashMap<String,String>)listView.getItemAtPosition(arg2);
String title=map.get("word");
String content=map.get("interpret");
etSearch.setText(title);
Toast.makeText(getApplicationContext(),
"你选择了第"+arg2+"个Item,itemTitle的值是:"+title+" "+"itemContent的值是:"+content,
Toast.LENGTH_SHORT).show();
}
});
//onCreate结束
}
private void refreshListView(){
Cursor c = dbRead.query("dict", null, null, null, null, null, null);
adapter.changeCursor(c);
}
//释放数据库连接
@Override
protected void onDestroy(){
super.onDestroy();
if(dbOpenHelper!=null){
dbOpenHelper.close();
}
}
//双击退出 使用按下的方式。双击退出一共有三种方式 按下 弹起 定时
//记录用户首次点击返回键的时间
private long firstTime=0;
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode==KeyEvent.KEYCODE_BACK && event.getAction()==KeyEvent.ACTION_DOWN){
if (System.currentTimeMillis()-firstTime>2000){
Toast.makeText(MainActivity.this,"再按一次退出程序--->onKeyDown",Toast.LENGTH_SHORT).show();
firstTime=System.currentTimeMillis();
}else{
finish();
System.exit(0);
}
return true;
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
// getMenuInflater().inflate(R.menu.main, menu);
return true;
}
//20201107 15:24
private void insertData(SQLiteDatabase readableDatabase,String word){
//生词ContentValues对象
ContentValues values =new ContentValues();
//向该对象当中插入键值对,其中键是列名,值是希望插入这一列的值,值必须和数据库的数据类型匹配
values.put("word",word);//保存联系人
readableDatabase.insert("dict",null,values);//执行插入操作
}
/**
* 2020 11 11 20 02 此方法是长按删除
* 里面是逆序排列
* 然后加入了查询所有
* 进而每次长按删除后都能够执行查询命令,实现刷新功能
*/
private AdapterView.OnItemLongClickListener listViewItemLongClickListener=new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1, final int arg2,
long arg3) {
new AlertDialog.Builder(MainActivity.this).setTitle("提醒").setMessage("您确定要删除该项吗").setNegativeButton("取消", null).setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
final ListView listView = (ListView) findViewById(R.id.list);
HashMap<String,String> map=(HashMap<String,String>)listView.getItemAtPosition(arg2);
String title=map.get("word");
db.delete("dict", "word=?", new String[]{title}); //删除之前定义的key
Toast.makeText(MainActivity.this, "删除成功", Toast.LENGTH_LONG).show();
// final ListView listView = (ListView) findViewById(R.id.list);
Cursor cursor = dbOpenHelper.getReadableDatabase().query("dict", null, null, null, null, null, null);
//创建ArrayList对象,用于保存查询输出的结果
ArrayList<Map<String, String>> resultList = new ArrayList<Map<String, String>>();// 创建一个结果集 两个String类型
while (cursor.moveToNext()) {
//用while循环一直判断,当下一条为假时,我们的游标循环也就结束了
//cursor.movetonext 定义一个游标 它的作用是将游标向下挪动一位 判断当前游标位置的下一条还有没有数据 如果有 就返回真 如果无 就返回假
Map<String, String> map1 = new HashMap<>(); //新开辟一个map的集合空间
map1.put("word", cursor.getString(1));//在第一行输出姓名
map1.put("interpret", cursor.getString(2));//在第二行输出电话
int n=0;
resultList.add(n,map1);
n++;
}
if (resultList == null || resultList.size() == 0) {
Toast.makeText(MainActivity.this, "没有相关记录", Toast.LENGTH_LONG).show();
} else {
//定义一个simpleAdapter,供列表项使用
SimpleAdapter simpleAdapter = new SimpleAdapter(MainActivity.this, resultList, R.layout.result_main,
new String[]{"word", "interpret"}, new int[]{
R.id.result_word, R.id.result_interpret});
listView.setAdapter(simpleAdapter);
}
refreshListView();
}
}).show();
refreshListView();
return true; //如果是true操作系统执行的反馈(震动或者声音) 如果是false 则不触发
}
};
}
5.3 activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#F0E6FD"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="25dp"
android:layout_y="84dp"
android:textSize="16dp"
android:text="请输入:"
android:textColor="#00E5BE" />
<EditText
android:id="@+id/search_et"
android:layout_width="140dp"
android:layout_height="wrap_content"
android:layout_x="85dp"
android:layout_y="68dp"
android:hint=""
android:textColor="#00E5BE"
android:textSize="18sp" />
<Button
android:id="@+id/search_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="102dp"
android:layout_y="4dp"
android:background="#F0E6FD"
android:text=""
android:textColor="#00E5BE" />
<Button
android:id="@+id/btn_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="259dp"
android:layout_y="70dp"
android:background="#F0E6FD"
android:text="发送"
android:textColor="#00E5BE" />
<ListView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="353dp"
android:layout_alignParentTop="true"
android:layout_x="0dp"
android:layout_y="122dp"
tools:layout_editor_absoluteX="219dp"
tools:layout_editor_absoluteY="455dp" />
<Button
android:id="@+id/btn_delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="12dp"
android:layout_y="4dp"
android:background="#F0E6FD"
android:text=""
android:textColor="#00E5BE"
tools:layout_editor_absoluteX="0dp"
tools:layout_editor_absoluteY="130dp" />
<Button
android:id="@+id/search_btn_bit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="193dp"
android:layout_y="4dp"
android:background="#F0E6FD"
android:text=""
android:textColor="#00E5BE"
tools:layout_editor_absoluteX="241dp"
tools:layout_editor_absoluteY="66dp" />
</AbsoluteLayout>
5.4 result_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/result_word"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Large Text"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/result_interpret"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Medium Text"
android:textAppearance="?android:attr/textAppearanceMedium" />
</LinearLayout>
5.5 AndroidMenifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="jscsd.sqlitedatabasetwo">
<application
android:allowBackup="true"
android:icon="@mipmap/contest"
android:label="实验一"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".AddActivity"></activity>
</application>
</manifest>