从数据库取数时动态生成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
相关产品推荐
相关产品推荐

