学习进度条3.21

所花时间: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 24
targetSdk 34
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility 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 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 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() {
@Override
public boolean onQueryTextSubmit(String query) {
performSearch(query);
return true;
}

@Override
public boolean onQueryTextChange(String newText) {
return false;
}
});
}

private void performSearch(String keyword) {
DatabaseHelper.searchPolicies(keyword, new DatabaseHelper.SearchCallback() {
@Override
public void onResult(List policies) {
runOnUiThread(() -> {
ArrayAdapter 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);
});
});
}

@Override
public 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 : "内容加载失败");
}
}

posted @ 2025-03-21 22:04  仙人兵马俑  阅读(38)  评论(0)    收藏  举报