生词本的实现:
接着上次的gridview视图,现在实现第一个demo生词本:
点击生词本:
插入多个单词数据后实现查询效果,输入单词或者解释的部分即可查询(由于模拟器没有中文键盘,所以测试数据我全用的英文,简单模拟以下):
好了下面开始介绍实现这些简单界面的逻辑代码:
(这一步还是在上一篇实现gridView的项目里,参照上一篇博客)
首先在grid适配器中定义一个点击接口,activity判断点击了哪个子项,并实现跳转,适配器中:
interface ClickListemer{
void onclck(String s1);
}//定义接口
ClickListemer Listemer;
public void setClickListener(ClickListemer s)//传入外界实现的接口对象
{
Listemer=s;
}
在适配器getView方法中实现视图的点击事件,并给更新的接口传递当前子项的名称:
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder=null;
//首先通过下面的if/else获取到了装入了正在显示的第position个view的两个控件的ViewHolder
//再给holder更新视图
if(convertView==null)
{
holder=new ViewHolder();
convertView= LayoutInflater.from(context).inflate(R.layout.grid_laoutunit,null);
holder.titleview=(ImageView) convertView.findViewById(R.id.title_view);
holder.title=(TextView) convertView.findViewById(R.id.text_title);
convertView.setTag(holder);
}
else
{
holder= (ViewHolder) convertView.getTag();
}
final GridviewEntity entity=list.get(position);
holder.titleview.setImageResource(entity.getDrawrouse());
holder.title.setText(entity.getTitle());
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Listemer.onclck(entity.getTitle());//回调参数
}
});
return convertView;
}
在activity中实现适配器的setClickListener方法并传入一个接口实例,获取到回调参数:
GridviewAdapter adapter=new GridviewAdapter(this);
adapter.setClickListener(new GridviewAdapter.ClickListemer() {
@Override
public void onclck(String s1) {
if(s1.equals("生词本"))
{
startActivity(new Intent(SecondActivity.this, WordActivity.class));
}
}
});
grid_laout.setAdapter(adapter);
现在实现了跳转到生词本的activity,下图为demo结构:
首先我先列出会待会使用到的SQL语句(对于语法就不赘述了):
//创建表,_id自动增长,word,detail默认为string
"create table dic(_id integer primary key autoincrement,word,detail)"
//插入元素
"insert into dic values(null,?,?)"
//模糊匹配
"select * from dic where word like ? or detail like ?"
下面展示接口类的内容(这里只写了两个String):
package com.example.studyapp.word;
public class Wordinterface {
public static final String TABLENAME="dic";
public static final String SQLITENAME="myDict.db";
}
现在创建myDataBaseHelper继承dataBaseHelper实现数据库的建立:
package com.example.studyapp.word;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.core.view.accessibility.AccessibilityViewCommand;
public class myDataBaseHelper extends SQLiteOpenHelper {
public myDataBaseHelper(@Nullable Context context, @Nullable String name, int version) {
super(context, name, null, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
//创建表
String sql="create table dic(_id integer primary key autoincrement,word,detail)";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
下面实现单词本的布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:layout_height="match_parent"
android:background="@mipmap/dancibak"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent">
<EditText
android:layout_marginTop="35dp"
android:id="@+id/edt_word"
android:hint="请输入单词"
android:textSize="20dp"
android:layout_marginRight="30dp"
android:layout_marginLeft="20dp"
android:background="@drawable/editlayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<EditText
android:layout_below="@id/edt_word"
android:id="@+id/edt_Detial"
android:layout_marginTop="20dp"
android:hint="请输入解释"
android:textSize="20dp"
android:layout_marginRight="30dp"
android:layout_marginLeft="20dp"
android:background="@drawable/editlayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_insert"
android:text="插入"
android:textSize="28dp"
android:layout_marginTop="30dp"
android:layout_centerHorizontal="true"
android:layout_below="@id/edt_Detial"
android:background="@drawable/btnlayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<EditText
android:layout_below="@id/btn_insert"
android:id="@+id/edt_search_text"
android:layout_marginTop="20dp"
android:hint="请输入要查询的单词或中文解释"
android:textSize="20dp"
android:layout_marginRight="10dp"
android:layout_marginLeft="10dp"
android:background="@drawable/editlayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_search"
android:text="查询"
android:textSize="28dp"
android:layout_marginTop="30dp"
android:layout_centerHorizontal="true"
android:layout_below="@id/edt_search_text"
android:background="@drawable/btnlayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</RelativeLayout>
继续实现activity的代码,在此代码中,实现控件的逻辑操作以及数据库的逻辑操作,同时当点击查询时,将查询到的cursor转换成list集合并封装成Bundle传递给Intent,让跳转的activity显示搜索到的内容(这里数据库搜索当中,实现了一个模糊查询,不得不感概SQL语句的强大,如果有不懂的地方建议关键词搜索相关资料):
package com.example.studyapp.word;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.example.studyapp.R;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class WordActivity extends AppCompatActivity {
private Button btnInsert;
private Button btnSearch;
private EditText edtword;
private EditText edtDetail;
private EditText edtsearchText;
myDataBaseHelper myDataBaseHelper;//数据库
SQLiteDatabase mDatabase;//读写base
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_word);
init();
}
private void init() {
btnInsert=findViewById(R.id.btn_insert);
btnSearch=findViewById(R.id.btn_search);
edtword=findViewById(R.id.edt_word);
edtsearchText=findViewById(R.id.edt_search_text);
edtDetail=findViewById(R.id.edt_Detial);
myDataBaseHelper=new myDataBaseHelper(this,Wordinterface.SQLITENAME,1);
mDatabase=myDataBaseHelper.getWritableDatabase();
btnInsert.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String sql="insert into dic values(null,?,?)";
mDatabase.execSQL(sql,new String[]{edtword.getText().toString(),edtDetail.getText().toString()});
Toast.makeText(WordActivity.this,"数据添加成功",Toast.LENGTH_SHORT).show();
}
});
btnSearch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(edtsearchText==null)
{
Toast.makeText(WordActivity.this,"查询的内容不能为空!",Toast.LENGTH_SHORT).show();
return;
}
else
{
String sql="select * from dic where word like ? or detail like ?";
//string两个成员分别对应两个? 进行模糊匹配
Cursor cursor = mDatabase.rawQuery(sql, new String[]{"%" + edtsearchText.getText().toString() + "%",
"%" + edtsearchText.getText().toString() + "%"});
ArrayList<Map<String, String>> changecursortolist = changecursortolist(cursor);
Bundle bundle=new Bundle();
//因为intent不能直接传送list集合,所以把list封装在Bundle中(将list序列化)
bundle.putSerializable("data",changecursortolist);
Intent intent=new Intent(WordActivity.this,ResultActivity.class);
intent.putExtras(bundle);
startActivity(intent);
}
}
});
}
//将cursor指向的所有数据添加到list中去
private ArrayList<Map<String,String>> changecursortolist(Cursor cursor) {
ArrayList<Map<String,String>> result=new ArrayList<>();
while(cursor.moveToNext())
{
Map<String,String> map=new HashMap<>();
map.put("word",cursor.getString(cursor.getColumnIndex("word")));
map.put("detail",cursor.getString(cursor.getColumnIndex("detail")));
result.add(map);
}
return result;
}
@Override
protected void onDestroy() {
//程序退出时对资源进行销毁
super.onDestroy();
if (mDatabase!=null) {
mDatabase.close();
}
if (myDataBaseHelper!=null) {
myDataBaseHelper.close();
}
}
}
跳转到了显示界面即ResurtActivity,写一个listview布局展示数据:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_height="match_parent"
android:background="@mipmap/wordbak"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent">
<ListView
android:id="@+id/list_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
listView的子项布局代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:layout_height="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical">
<LinearLayout android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:orientation="horizontal"
android:layout_width="match_parent">
<TextView
android:text="单词:"
android:textSize="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/word"
android:textSize="25dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
<LinearLayout android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:orientation="horizontal"
android:layout_width="match_parent">
<TextView
android:text="解释:"
android:textSize="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/detail"
android:textSize="25dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
</LinearLayout>
下面在ResurtActivity中获取搜索到的List集合数据,并用SimpleApapter实现listView的适配器:
package com.example.studyapp.word;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import com.example.studyapp.R;
import java.util.List;
import java.util.Map;
public class ResultActivity extends AppCompatActivity {
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_result);
listView=findViewById(R.id.list_item);
Intent intent = getIntent();
Bundle bundle=intent.getExtras();
List<Map<String,String>> listData= (List<Map<String, String>>) bundle.getSerializable("data");
for (Map<String, String> listDatum : listData) {
Log.w("数据",listDatum.get("word")+listDatum.get("detail"));
}
SimpleAdapter adapter=new SimpleAdapter(ResultActivity.this,
listData,
R.layout.resultlaout,
new String[]{"word","detail"},new int[]{R.id.word,R.id.detail});
listView.setAdapter(adapter);
}
}
到此生词本的大致功能已经实现。
后续继续更新一些简单的小项目。。。