如何在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
相关产品推荐
相关产品推荐

