本期,我们将ListView和SQL相适配,并且添加一个页面便于添加数据
TheThirdActivity:
由于本期主题是数据库的应用,所以我就跳过说明如何创建活动部分,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"
android:gravity="center"
android:padding="20dp"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="20dp"
android:orientation="vertical"
android:gravity="center"
>
<EditText android:layout_width="match_parent"
android:layout_height="50dp"
android:hint="请输入姓名"
android:textColorHint="@color/black"
android:id="@+id/edt_1"
android:inputType="text"
/>
<EditText android:layout_width="match_parent"
android:layout_height="50dp"
android:hint="请输入年龄"
android:textColorHint="@color/black"
android:id="@+id/edt_2"
android:inputType="number"
/>
</LinearLayout>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="提交"
android:id="@+id/btn_1"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="返回"
android:id="@+id/btn_2"
/>
</LinearLayout>
对于添加数据类型的活动,思路就是:按下按钮,获取用户输入数据,添加数据库,调用组件告诉用户已完成。
Java文件代码也跳过(作者个人认为不难,如需要私信作者将这一块详细描述下),代码如下:
package com.example.app;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import androidx.annotation.Nullable;
public class ThirdActivity extends Activity {
private EditText editText1;
private EditText editText2;
private Button button1;
private Button button2;
private Data data ;
private SQL sql ;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.third_activity);
editText1 = findViewById(R.id.edt_1);
editText2 = findViewById(R.id.edt_2);
button1 = findViewById(R.id.btn_1);
button2 = findViewById(R.id.btn_2);
data = new Data();
sql = new SQL(this);
button1.setOnClickListener( view -> {
data.setData(editText1.getText().toString() ,
Integer.parseInt(editText2.getText().toString()) );
sql.insert(data);
Tool.callAlertBuilder(this,"系统提示" , "添加成功" ).show();
} );
button2.setOnClickListener(view -> finish());
}
}
请读者注意不要忘记在manifest登记这个活动,并在主页面新添加个按钮以便于跳转进来。
AndroidManifest.xml:
<activity
android:name=".ThirdActivity"
android:exported="true">
</activity>
然后,我们添加的活动板块就完成了!
ListView显示SQL数据:
在这之前,让我们先把之前写的代码优化一下:
public static ArrayList<Data> arrayList = new ArrayList<>() ;
Data data = new Data();
data.setData("李晓明" , 14);
arrayList.add(data);
/*
Map<String,Object> map = Map.of("姓名", "李晓明"
, "年龄","14");
arrayList.add(map);
*/
Data data2 = new Data();
data2.setData("王梦" , 15);
arrayList.add(data2);
/*
Map<String,Object> map2 = Map.of("姓名","王梦"
, "年龄","15");
arrayList.add(map2);
*/
由于SimpleAdapter只支持map,不然会报错:
'android.widget.SimpleAdapter' 中的 'SimpleAdapter(android.content.Context, java.util.List<? extends java.util.Map<java.lang.String,?>>, int, java.lang.String[], int[])' 无法应用于 '(com.example.app.SecondActivity, java.util.ArrayList<com.example.app.Data>, int, java.lang.String[], int[])'
因此我们有两种方案:1,覆写Adapter ,2,把Data转成Map ,这里我想用第二种方法,简单一点,若读者需要第一种,可在评论区留言扣1,作者收到后会立即更新第一种方案
考虑到后续可能会再次用到Data转Map因此我们直接在Tool类写个辅助方法:
public static ArrayList<Map<String , String>> arrDataToMap(ArrayList<Data> datas){
ArrayList<Map<String , String>> maps = new ArrayList<>();
for ( Data data : datas ){
Map map = new HashMap();
map.put("姓名", data.getName());
map.put("年龄", String.valueOf(data.getAge()) );
maps.add(map);
}
return maps;
}
这里会存在俩易错点
- data.getAge()不是实参,无法使用.toString()
- SimpleAdapter中需要的是Map<String , Object > 所以必须要用泛类修饰Map
之后我们在SecondActivity中把ArrayList替换成 Tool.arrDataToMap(arrayList):
adapter = new SimpleAdapter(this
,Tool.arrDataToMap(arrayList)
,R.layout.list_view1
,resName
,resId );
listView1.setAdapter(adapter);
listView1.setOnItemClickListener((parent, view, position, id) -> {
Map getMap = Tool.arrDataToMap(arrayList).get(position);
Tool.callAlertBuilder(this ,"列表显示" ,getMap.toString())
.setPositiveButton("确定", (dialog, which) -> { })
.setCancelable(true)
.show();
});
运行一下看看:
发现替换后程序仍能正常运行,所以我们就可以直接把这俩非数据库的数据删除了!
回到SecondActivity,实例化一个SQL对象sql ,把arrayList替换成sql.queryAll() ,删除之前手动添加的数据:
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_activity);
sql = new SQL(this);
button1 = findViewById(R.id.button1);
button1.setOnClickListener(view -> finish());
listView1 = findViewById(R.id.list_view1);
adapter = new SimpleAdapter(this
,Tool.arrDataToMap(sql.queryAll())
,R.layout.list_view1
,resName
,resId );
listView1.setAdapter(adapter);
listView1.setOnItemClickListener((parent, view, position, id) -> {
Map getMap = Tool.arrDataToMap(sql.queryAll()).get(position);
Tool.callAlertBuilder(this ,"列表显示" ,getMap.toString())
.setPositiveButton("确定", (dialog, which) -> { })
.setCancelable(true)
.show();
});
}
到此,所有东西都开发完毕,下一期开始Fragment ,注意,我们即将步入业余选手阶段,会逐渐跟更高级的东西接轨,不懂的一定要问,不然漏掉的很有可能是最重要的!