如何在ListView中展示数据库随机新增的最新10条数据?
解决ListView显示最新10条数据库条目的问题
首先咱们先梳理下你现有代码里的几个关键问题:
- 第一行
int i = String.valueOf(mKondisiList));完全错误——String.valueOf()返回的是字符串,没法赋值给int类型,还多了一个右括号,这行直接会导致编译失败,必须删掉。 - 那段循环完全没必要,每次循环都重复获取全量数据、创建新适配器、设置适配器,最后一次操作会覆盖前面的;而且你是设置适配器之后才反转列表,适配器已经用原来的列表初始化了,界面根本不会显示反转后的结果。
- 没有限制只取最新10条,获取全量数据再处理不仅效率低,还浪费内存。
接下来给你两种靠谱的实现方案,优先推荐第一种:
方案1:让数据库直接返回最新10条(最优)
直接在数据库查询时就按时间倒序,只取前10条数据,这样性能最好,不用在内存里处理全量数据。
假设你的数据库表有一个记录创建时间的字段(比如created_at),修改你的MyDbHelper里的查询方法:
public List<Kondisi> getLatestKondisi(int limit) { List<Kondisi> kondisiList = new ArrayList<>(); SQLiteDatabase db = this.getReadableDatabase(); // 核心SQL:按创建时间倒序,只取前limit条 Cursor cursor = db.rawQuery( "SELECT * FROM kondisi_table ORDER BY created_at DESC LIMIT ?", new String[]{String.valueOf(limit)} ); if (cursor.moveToFirst()) { do { // 从Cursor中读取数据,封装成Kondisi对象 Kondisi kondisi = new Kondisi(); kondisi.setId(cursor.getInt(cursor.getColumnIndexOrThrow("id"))); kondisi.setYourField(cursor.getString(cursor.getColumnIndexOrThrow("your_field_name"))); // 填充其他字段... kondisiList.add(kondisi); } while (cursor.moveToNext()); } cursor.close(); db.close(); return kondisiList; }
然后在Activity里调用这个方法,直接设置适配器:
// 获取最新10条数据 mKondisiList = myDbHelper.getLatestKondisi(10); // 初始化适配器并设置给ListView adapterKondisi = new ListKondisiAdapter(this, mKondisiList); lvKondisi.setAdapter(adapterKondisi);
方案2:如果暂时不想改数据库方法(兼容旧代码)
如果你的getListKondisi()还是返回全量正序数据(旧条目在前),可以先反转列表,再截取前10条:
// 获取全量数据 mKondisiList = myDbHelper.getListKondisi(); // 反转列表,让最新的条目在最前面 Collections.reverse(mKondisiList); // 如果数据超过10条,只保留前10条 if (mKondisiList.size() > 10) { mKondisiList = mKondisiList.subList(0, 10); } // 初始化适配器并设置 adapterKondisi = new ListKondisiAdapter(this, mKondisiList); lvKondisi.setAdapter(adapterKondisi);
额外提示
如果你的数据是随机时间动态添加的,想要实时更新ListView,可以在数据添加完成后,重新调用上面的代码刷新适配器,或者更新适配器内的列表数据后调用adapter.notifyDataSetChanged()。
内容的提问来源于stack exchange,提问作者Ibg Teguh
相关产品推荐
相关产品推荐

