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

如何在Android Studio中用ListView展示SQLite数据库数据?

嘿,我来帮你搞定这个问题!你之前用AlertDialog查看数据时遇到的返回键问题,本质是每次弹出新的Dialog都会被加入系统返回栈,所以按返回键会依次弹出之前的Dialog。换成ListView展示就完全不会有这个问题了,而且ListView是Android展示列表数据的标准组件,下面我一步步教你实现:

实现ListView展示数据库数据的完整步骤

1. 创建列表项布局文件

首先在res/layout目录下新建list_item.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="wrap_content"
    android:orientation="vertical"
    android:padding="16dp">

    <TextView
        android:id="@+id/tv_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="16sp"
        android:textStyle="bold"/>

    <TextView
        android:id="@+id/tv_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="14sp"
        android:layout_marginTop="4dp"/>

    <TextView
        android:id="@+id/tv_email"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="14sp"
        android:layout_marginTop="4dp"/>

    <TextView
        android:id="@+id/tv_phone"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="14sp"
        android:layout_marginTop="4dp"/>

</LinearLayout>

2. 编写自定义CursorAdapter

因为我们从数据库获取的是Cursor类型数据,用CursorAdapter适配会更高效。新建ContactAdapter.java类:

package com.example.user.phonebook;

import android.content.Context;
import android.database.Cursor;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CursorAdapter;
import android.widget.TextView;

public class ContactAdapter extends CursorAdapter {

    public ContactAdapter(Context context, Cursor cursor) {
        super(context, cursor, 0);
    }

    // 创建新的列表项视图
    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        return LayoutInflater.from(context).inflate(R.layout.list_item, parent, false);
    }

    // 绑定数据到视图
    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        // 获取布局控件
        TextView tvId = view.findViewById(R.id.tv_id);
        TextView tvName = view.findViewById(R.id.tv_name);
        TextView tvEmail = view.findViewById(R.id.tv_email);
        TextView tvPhone = view.findViewById(R.id.tv_phone);

        // 从Cursor中提取数据
        String id = cursor.getString(cursor.getColumnIndexOrThrow(Database.ID));
        String name = cursor.getString(cursor.getColumnIndexOrThrow(Database.NAME));
        String email = cursor.getString(cursor.getColumnIndexOrThrow(Database.EMAIL));
        String phone = cursor.getString(cursor.getColumnIndexOrThrow(Database.PHONE));

        // 把数据设置到控件上
        tvId.setText("ID: " + id);
        tvName.setText("Name: " + name);
        tvEmail.setText("Email: " + email);
        tvPhone.setText("Phone: " + phone);
    }
}

3. 修改MainActivity整合ListView

现在更新你的MainActivity.java,替换原来的AlertDialog逻辑,改用ListView展示数据,同时处理数据更新后的列表刷新:

首先添加Adapter成员变量:

private ContactAdapter adapter;

然后修改onCreate方法并新增刷新方法:

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

    // 原有控件初始化代码不变
    ed1=(EditText)findViewById(R.id.editText);
    ed2=(EditText)findViewById(R.id.editText4);
    ed3=(EditText)findViewById(R.id.editText3);
    ed4=(EditText)findViewById(R.id.editText2);
    tv=(TextView) findViewById(R.id.textView2);
    bn1=(Button) findViewById(R.id.button);
    bn2=(Button) findViewById(R.id.button2);
    bn3=(Button) findViewById(R.id.button3);
    lv=(ListView)findViewById(R.id.listview) ;
    mydb=new Database(this);

    // 初始化Adapter并绑定到ListView
    Cursor cursor = mydb.getData();
    adapter = new ContactAdapter(this, cursor);
    lv.setAdapter(adapter);

    // 添加数据后刷新列表
    bn1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            boolean value=mydb.AddData(ed4.getText().toString(),ed1.getText().toString(),ed2.getText().toString(),ed3.getText().toString());
            if (value==true) {
                Toast.makeText(getApplicationContext(),"Data Inserted",Toast.LENGTH_SHORT).show();
                refreshListView();
            } else {
                Toast.makeText(getApplicationContext(),"Error",Toast.LENGTH_SHORT).show();
            }
        }
    });

    // 查看按钮改为刷新列表(也可以直接去掉,因为ListView会一直展示最新数据)
    bn2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            refreshListView();
            Cursor cv=mydb.getData();
            if (cv.getCount()==0) {
                Toast.makeText(getApplicationContext(),"No data found",Toast.LENGTH_SHORT).show();
            }
        }
    });

    // 更新数据后刷新列表
    bn3.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            boolean isupdated=mydb.UpdateDate(ed4.getText().toString(),ed1.getText().toString(),ed2.getText().toString(),ed3.getText().toString());
            if (isupdated==true) {
                Toast.makeText(getApplicationContext(),"Data Updated",Toast.LENGTH_SHORT).show();
                refreshListView();
            } else {
                Toast.makeText(getApplicationContext(),"Updation failed",Toast.LENGTH_SHORT).show();
            }
        }
    });
}

// 新增列表刷新方法
private void refreshListView() {
    Cursor newCursor = mydb.getData();
    adapter.swapCursor(newCursor);
}

4. 额外注意事项

  • 确保你的activity_main.xml中已经包含id为listview的ListView组件,比如:
<ListView
    android:id="@+id/listview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@+id/button3"/>
  • 数据添加/更新后调用refreshListView(),用新Cursor替换旧数据,ListView会自动更新显示
  • 原来的AlertDialog压栈问题彻底解决,因为ListView直接在Activity页面内展示,按返回键会直接退出Activity

这样你就能在ListView里正常展示所有数据库条目,并且数据更新后能实时刷新了!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:05:30