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

