如何检查记录存在于getItemViewType内的数据库中

时间:2015-10-30 02:27:35

标签: android sqlite listview

我有一个产品列表,每行都有一个“保存”功能,它将项目产品存储到本地数据库。我通过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;
}

1 个答案:

答案 0 :(得分:1)

因此冻结可能是由于对isProductSaved的大量调用,您可以通过评论和测试,或通过使用Android设备监视器分析您的应用来确定这一点。

您可以通过向产品中添加字段exists来轻松删除该数据库访问权限。如果插入成功,则默认值为falseinsertProductToDB将其设置为true。有了这个,getViewType会更快。

@Override
public int getItemViewType(int position) {
   if (listProds.get(position).isExists())) {
      return 1;
   }
   return 0;
}

如果您不想使用额外字段更改模型对象,则还可以在适配器中维护类似SparseArray的地图。它将包含已保存产品的id