You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从数据库取数时动态生成ListView/TextView的实现求助

从SQLite数据库获取数据并展示在ListView/TextView的实现方案

嘿,作为Android新手碰到动态数据展示的问题太正常了!我给你整理了一套完整的实现代码,包含SQLite数据库的创建、数据插入,以及两种展示方式(ListView和可滚动TextView)的实现,你可以按需选择:

第一步:创建SQLite数据库帮助类

首先我们需要一个数据库帮助类来管理数据库的创建和操作,这里我们创建一个FruitDbHelper类:

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class FruitDbHelper extends SQLiteOpenHelper {
    // 数据库名称和版本
    private static final String DATABASE_NAME = "Fruits.db";
    private static final int DATABASE_VERSION = 1;

    // 水果表的创建语句
    private static final String CREATE_TABLE_FRUITS = "CREATE TABLE fruits (" +
            "id INTEGER PRIMARY KEY AUTOINCREMENT," +
            "name TEXT NOT NULL)";

    public FruitDbHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // 创建水果表
        db.execSQL(CREATE_TABLE_FRUITS);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // 如果数据库版本升级,这里可以处理表的更新逻辑,比如删除旧表重建
        db.execSQL("DROP TABLE IF EXISTS fruits");
        onCreate(db);
    }
}

第二步:数据库操作工具类(让逻辑更清晰)

为了让数据库操作更简洁,我们封装一个工具类来处理插入和查询逻辑:

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import java.util.ArrayList;
import java.util.List;

public class FruitDao {
    private SQLiteDatabase db;

    public FruitDao(Context context) {
        FruitDbHelper dbHelper = new FruitDbHelper(context);
        db = dbHelper.getWritableDatabase();
    }

    // 插入单条水果数据
    public void insertFruit(String fruitName) {
        ContentValues values = new ContentValues();
        values.put("name", fruitName);
        db.insert("fruits", null, values);
    }

    // 查询所有水果名称
    public List<String> getAllFruits() {
        List<String> fruitList = new ArrayList<>();
        Cursor cursor = db.query("fruits", new String[]{"name"}, null, null, null, null, null);
        if (cursor.moveToFirst()) {
            do {
                String name = cursor.getString(cursor.getColumnIndexOrThrow("name"));
                fruitList.add(name);
            } while (cursor.moveToNext());
        }
        cursor.close();
        return fruitList;
    }

    // 判断表是否为空(用于首次运行插入测试数据)
    public boolean isFruitsTableEmpty() {
        Cursor cursor = db.rawQuery("SELECT COUNT(*) FROM fruits", null);
        cursor.moveToFirst();
        int count = cursor.getInt(0);
        cursor.close();
        return count == 0;
    }
}

第三步:在Activity中实现数据展示

接下来我们在主Activity里完成数据库初始化、插入测试数据(50种水果),然后选择ListView或者TextView展示:

方式一:用ListView展示(推荐,适合大量数据)

首先在activity_main.xml中添加ListView:

<?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">

    <ListView
        android:id="@+id/fruit_list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

然后是MainActivity.java的代码:

import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import androidx.appcompat.app.AppCompatActivity;

import java.util.List;

public class MainActivity extends AppCompatActivity {
    private FruitDao fruitDao;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        fruitDao = new FruitDao(this);

        // 首次运行时插入50种测试水果数据
        if (fruitDao.isFruitsTableEmpty()) {
            insertTestFruits();
        }

        // 获取所有水果数据
        List<String> fruitList = fruitDao.getAllFruits();

        // 初始化ListView和Adapter
        ListView listView = findViewById(R.id.fruit_list_view);
        ArrayAdapter<String> adapter = new ArrayAdapter<>(this,
                android.R.layout.simple_list_item_1, fruitList);
        listView.setAdapter(adapter);
    }

    // 插入50种测试水果(你可以替换成从真实数据源获取的逻辑)
    private void insertTestFruits() {
        String[] testFruits = {
                "苹果", "香蕉", "橙子", "草莓", "蓝莓",
                "芒果", "菠萝", "西瓜", "桃子", "李子",
                "樱桃", "葡萄", "猕猴桃", "火龙果", "哈密瓜",
                "柚子", "柠檬", "荔枝", "龙眼", "榴莲",
                "山竹", "牛油果", "番石榴", "莲雾", "杨桃",
                "杏子", "柿子", "枣子", "山楂", "海棠果",
                "椰子", "菠萝蜜", "蔓越莓", "树莓", "黑莓",
                "覆盆子", "金桔", "百香果", "释迦果", "人参果",
                "芭乐", "沙棘", "刺梨", "诺丽果", "神秘果",
                "红毛丹", "鳄梨", "番荔枝", "黄皮果", "青梅"
        };
        for (String fruit : testFruits) {
            fruitDao.insertFruit(fruit);
        }
    }
}

方式二:用可滚动的TextView展示(适合简单展示所有内容)

如果不想用ListView,也可以把所有水果拼接成字符串放在TextView里,让TextView可滚动:

修改activity_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"
    android:padding="16dp">

    <TextView
        android:id="@+id/fruit_text_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="vertical"
        android:textSize="16sp"/>

</LinearLayout>

然后修改MainActivity.java中的展示逻辑:

// 替换ListView的代码为以下内容
TextView textView = findViewById(R.id.fruit_text_view);
// 拼接水果列表为字符串,每个水果换行
StringBuilder sb = new StringBuilder();
for (String fruit : fruitList) {
    sb.append(fruit).append("\n");
}
textView.setText(sb.toString());
// 允许TextView滚动
textView.setMovementMethod(new android.text.method.ScrollingMovementMethod());

小提醒

  • 如果你是从真实的远程数据库获取数据,记得要在子线程中进行网络请求,不能在主线程操作,避免ANR(可以用Coroutines或者Retrofit等框架)。
  • 上面的测试数据是我随便写的50种,你可以根据实际需求替换成从数据库查询的真实数据。
  • 数据库操作也建议放在子线程,避免主线程阻塞,上面的示例为了简化放在了主线程,实际项目中最好用异步操作。

内容的提问来源于stack exchange,提问作者user9589524

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:12:07