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

Xamarin Android中SQLite多记录无法在ListView显示求助

解决Xamarin Android中SQLite多记录无法在ListView显示的问题

问题分析

  • 你当前代码循环给同一个TextView赋值,每次都会覆盖之前的内容,最终只能看到单条记录。
  • 没有使用ListView的适配器模式绑定多条数据,这是ListView展示列表数据的标准方式。
  • 直接拼接SQL语句存在SQL注入风险,必须改用参数化查询。

修复步骤

1. 创建ListView子项布局

新建item_word.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="wrap_content"
    android:orientation="vertical"
    android:padding="16dp">

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

    <TextView
        android:id="@+id/tv_meaning"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="16sp"
        android:layout_marginTop="4dp"/>
</LinearLayout>

2. 自定义ListView适配器

创建继承自BaseAdapter的适配器类,实现数据与子项布局的绑定:

public class WordAdapter : BaseAdapter<person>
{
    private List<person> _wordList;
    private Context _context;

    public WordAdapter(Context context, List<person> wordList)
    {
        _context = context;
        _wordList = wordList;
    }

    public override person this[int position] => _wordList[position];

    public override int Count => _wordList.Count;

    public override long GetItemId(int position) => position;

    public override View GetView(int position, View convertView, ViewGroup parent)
    {
        View view = convertView ?? LayoutInflater.From(_context).Inflate(Resource.Layout.item_word, parent, false);

        TextView tvWord = view.FindViewById<TextView>(Resource.Id.tv_word);
        TextView tvMeaning = view.FindViewById<TextView>(Resource.Id.tv_meaning);

        var wordItem = _wordList[position];
        tvWord.Text = wordItem.word;
        tvMeaning.Text = wordItem.meaning;

        return view;
    }
}

3. 修改Data方法,绑定ListView

修正数据查询逻辑,用适配器将数据绑定到ListView:

private void Data()
{
    lstUser.Clear(); // 清空旧数据,避免重复累积

    // 参数化查询,避免SQL注入,同时支持模糊搜索
    string query = "select * from tbl_wordss where word like ?";
    string searchText = $"%{editText1.Text}%";
    ICursor selectData = sqliteDB.RawQuery(query, new string[] { searchText });

    if (selectData.MoveToFirst())
    {
        do
        {
            person user = new person();
            user.id = selectData.GetString(selectData.GetColumnIndex("id"));
            user.word = selectData.GetString(selectData.GetColumnIndex("word"));
            user.meaning = selectData.GetString(selectData.GetColumnIndex("meaning"));
            lstUser.Add(user);
        } while (selectData.MoveToNext());
    }
    selectData.Close();

    // 绑定数据到ListView(确保主布局中ListView的Id为listView_words)
    ListView listView = FindViewById<ListView>(Resource.Id.listView_words);
    listView.Adapter = new WordAdapter(this, lstUser);
}

4. 主布局添加ListView

在activity_main.xml中添加ListView控件(替换或补充原有的TextView):

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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 17:07:28