所花时间:8小时
代码量:300
搏客量:1
了解到的知识点:
今日尝试了开发一个手机模糊查找的app
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath "com.android.tools.build:gradle:8.1.0"
}
}
allprojects {
repositories {
google()
mavenCentral()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
gradle
plugins {
id 'com.android.application'
}
android {
namespace 'com.example.policysearch'
compileSdk 34
defaultConfig {applicationId "com.example.policysearch"minSdk 24targetSdk 34versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}
}
compileOptions {sourceCompatibility JavaVersion.VERSION_17targetCompatibility JavaVersion.VERSION_17
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.11.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
// MySQL连接(仅用于测试环境)
implementation 'mysql:mysql-connector-java:8.0.33'
implementation 'com.zaxxer:HikariCP:5.0.1'// 异步处理
implementation 'androidx.concurrent:concurrent-futures:1.1.0'testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
}
public class Policy {
private long id;
private String name;
private String text;
// 构造函数
public Policy(long id, String name, String text) {this.id = id;this.name = name;this.text = text;
}// Getters
public long getId() { return id; }
public String getName() { return name; }
public String getText() { return text; }
}
import android.util.Log;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
public class DatabaseHelper {
private static final String TAG = "DatabaseHelper";
private static final HikariDataSource dataSource;
static {HikariConfig config = new HikariConfig();config.setJdbcUrl("jdbc:mysql://your_server:3306/test");config.setUsername("your_user");config.setPassword("your_password");config.setDriverClassName("com.mysql.cj.jdbc.Driver");dataSource = new HikariDataSource(config);
}public interface SearchCallback {void onResult(List<Policy> policies);void onError(Exception e);
}public static void searchPolicies(String keyword, SearchCallback callback) {Executor executor = Executors.newSingleThreadExecutor();executor.execute(() -> {try (Connection conn = dataSource.getConnection();PreparedStatement ps = conn.prepareStatement("SELECT id, name, text FROM policy WHERE name LIKE ?")) {ps.setString(1, "%" + keyword + "%");ResultSet rs = ps.executeQuery();List<Policy> policies = new ArrayList<>();while (rs.next()) {policies.add(new Policy(rs.getLong("id"),rs.getString("name"),rs.getString("text")));}callback.onResult(policies);} catch (SQLException e) {Log.e(TAG, "Database error", e);callback.onError(e);}});
}
}
import android.content.Intent;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SearchView;
import androidx.appcompat.app.AppCompatActivity;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private ListView listView;
private SearchView searchView;
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);listView = findViewById(R.id.listView);searchView = findViewById(R.id.searchView);searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {@Overridepublic boolean onQueryTextSubmit(String query) {performSearch(query);return true;}@Overridepublic boolean onQueryTextChange(String newText) {return false;}});
}private void performSearch(String keyword) {DatabaseHelper.searchPolicies(keyword, new DatabaseHelper.SearchCallback() {@Overridepublic void onResult(List<Policy> policies) {runOnUiThread(() -> {ArrayAdapter<Policy> adapter = new ArrayAdapter<>(MainActivity.this,android.R.layout.simple_list_item_1,policies);listView.setAdapter(adapter);listView.setOnItemClickListener((parent, view, position, id) -> {Policy selected = (Policy) parent.getItemAtPosition(position);Intent intent = new Intent(MainActivity.this, DetailActivity.class);intent.putExtra("policyText", selected.getText());startActivity(intent);});});}@Overridepublic void onError(Exception e) {runOnUiThread(() -> Toast.makeText(MainActivity.this, "搜索失败", Toast.LENGTH_SHORT).show());}});
}
}
import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
public class DetailActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
TextView textView = findViewById(R.id.textView);String policyText = getIntent().getStringExtra("policyText");textView.setText(policyText != null ? policyText : "内容加载失败");
}
}