场景引入:
小明最近在开发一个美食类APP,需要把用户收藏的菜谱以"九宫格"形式展示,当他从数据库读取数据时,发现GridView和数据库的配合总出bug——要么数据加载慢得像蜗牛🐌,要么滑动时疯狂闪退,别担心!今天我们就用最接地气的方式,搞定GridView与数据库的完美协作!
安卓默认使用SQLite数据库,操作分三步走:
// 1. 创建数据库帮助类 public class RecipeDBHelper extends SQLiteOpenHelper { private static final String DB_NAME = "food.db"; private static final int DB_VERSION = 1; public RecipeDBHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE recipes (_id INTEGER PRIMARY KEY, name TEXT, image BLOB)"); } }
增:用ContentValues
避免SQL注入
SQLiteDatabase db = helper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("name", "红烧肉"); values.put("image", getImageBytes(R.drawable.pork)); db.insert("recipes", null, values);
查:Cursor一定要关闭!
Cursor cursor = db.query("recipes", null, null, null, null, null, null); try { while (cursor.moveToNext()) { String name = cursor.getString(cursor.getColumnIndex("name")); } } finally { cursor.close(); // 防止内存泄漏! }
Pro Tip:大数据查询用Transaction
提速30%+ ⚡
public class RecipeAdapter extends BaseAdapter { private List<Recipe> mData; private Context mContext; // 构造方法传入数据(建议用List而非Cursor直接操作) public RecipeAdapter(Context context, List<Recipe> data) { this.mData = data; this.mContext = context; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = LayoutInflater.from(mContext) .inflate(R.layout.item_recipe, parent, false); } ImageView iv = convertView.findViewById(R.id.iv_cover); TextView tv = convertView.findViewById(R.id.tv_name); Recipe item = mData.get(position); tv.setText(item.getName()); iv.setImageBitmap(BitmapFactory.decodeByteArray( item.getImage(), 0, item.getImage().length)); return convertView; } }
BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 4; // 尺寸缩小4倍
当数据库变化时,自动刷新GridView:
// 在数据变更处通知适配器 public void addNewRecipe(Recipe recipe) { mData.add(recipe); notifyDataSetChanged(); // 简单粗暴版 // 高级版:用DiffUtil智能刷新 DiffUtil.DiffResult result = DiffUtil.calculateDiff(new MyCallback(oldData, newData)); result.dispatchUpdatesTo(this); }
// 实现OnScrollListener gridView.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (firstVisibleItem + visibleItemCount == totalItemCount) { loadMoreDataFromDB(); // 触发加载更多 } } });
Room
或AsyncQueryHandler
Glide
或Picasso
等第三方库省心 最后的小彩蛋 🎉
给GridView加上炫酷动画:
// 在getView中添加 Animation animation = AnimationUtils.loadAnimation(mContext, R.anim.scale_in); convertView.startAnimation(animation);
现在你的GridView应该像德芙一样丝滑了!如果遇到数据错乱,记得检查是不是忘了notifyDataSetChanged()
哦~ 下次见! 👋
(本文基于2025年7月安卓开发最佳实践撰写)
本文由 藩雁菱 于2025-07-28发表在【云服务器提供商】,文中图片由(藩雁菱)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/466740.html
发表评论