我有一个产品列表,每行都有一个“保存”功能,它将项目产品存储到本地数据库。我通过https://github.com/baoyongzhang/SwipeMenuListView使用SwipeMenuListView,我必须检查记录是否存在于ListAdapter中的getItemViewType中以删除保存的行的保存功能。 但问题是,“检查记录是否存在”使我的listview在notifyDataSetChanged暂停一段时间后冻结(单击“保存”然后通知notifyDataSetChanged然后列表被冻结,直到我再次触摸listview)。 我该如何解决? 每一个建议都将受到高度赞赏。提前致谢。这是我的代码:
@Override
public boolean onMenuItemClick(int position, SwipeMenu menu, int index) {
switch (index) {
case 0:
break;
case 1:
ProductDetailsVo.ProductInfo productInfo = listResult.get(position);
insertProductToDB(productInfo);
break;
}
和方法insertProductToDB:
private void insertProductToDB(ProductDetailsVo.ProductInfo productInfo) {
databaseManager.insertProductToDB(productInfo);
if (adapter != null) {
adapter.notifyDataSetChanged();
}
}
适配器:
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
if (databaseManager.isProductSaved(listProds.get(position).getProductId())) {// cause listview freeze
return 1;
}
return 0;
}
答案 0 :(得分:1)
因此冻结可能是由于对isProductSaved
的大量调用,您可以通过评论和测试,或通过使用Android设备监视器分析您的应用来确定这一点。
您可以通过向产品中添加字段exists
来轻松删除该数据库访问权限。如果插入成功,则默认值为false
,insertProductToDB
将其设置为true。有了这个,getViewType
会更快。
@Override
public int getItemViewType(int position) {
if (listProds.get(position).isExists())) {
return 1;
}
return 0;
}
如果您不想使用额外字段更改模型对象,则还可以在适配器中维护类似SparseArray
的地图。它将包含已保存产品的id
。