2016-06-10 97 views
0

我对跟踪某人的费用的应用程序工作问题,用户将他们所购买的,它跟踪的是,费用显示在recyclerview,有来的时候,一个有太多的项目,因此需要搜索,因此我添加了一个正在查找的搜索功能,但是由于我正在处理费用,因此适配器有一个复选框,用于指示是否已经支付费用,当我搜索项目并勾选它已经支付的功能工作正常,但只要我退出搜索模式,我注意到的东西,在项目开始回到原来的位置,在列表中,但占据该位置的项目之前修改的项目也继承了支付状态,它被勾选为支付,希望我的解释是有道理的,这里有一些屏幕截图来演示我的意思:与Android搜索查看在回收站

在第一个屏幕截图

我们有一个正常的列表,但我将寻找Dgdf目前Dgdf在位置1

enter image description here

搜索Dgdf后所花费的数组中的位置0

enter image description here

因为我有我一直在寻找的项目为在这种情况下是Dgdf我决定将其标记为付费的我做

enter image description here

但在这里,只要我存在编辑模式的项目是需要位置0也被选中作为支付

enter image description here是问题

下面是我的代码,我使用了搜索:

protected FilterResults performFiltering(CharSequence constraint) { 
      final FilterResults oReturn = new FilterResults(); 
      final ArrayList<Expense> results = new ArrayList<>(); 

      //I thought loading new data from database each time would 
      // help but did not help at all 
      filterSearch = database.getAllExpenses(); 
      if (constraint != null) { 
       if (filterSearch != null & filterSearch.size() > 0) 
       { 
        for (Expense g : filterSearch) 
         if (g.getMerchantName().toLowerCase().contains(constraint.toString().toLowerCase())) 
          results.add(g); 
        oReturn.values = results; 
       } 
      } 
      return oReturn; 
     } 


@Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 

      //update adapter arraylist 
      adapterExpenseList = (ArrayList<Expense>) results.values; 
      notifyDataSetChanged(); 


     } 
+0

显然,你不应该使用的位置,但有些ID ......这样的错误是不过滤,但在存储项目......简单的方法将是商店的选中状态,如果产品支票'Expense'模型本身 - 或者在某些SpraseArray – Selvin

+0

Selvin是的,你是正确的,将它们存储在该模型将工作,这就是我做的,显然它不工作,我试着打无效的回收和我注意到了所有项目的检查,问题IDS在我调用'notifydatasetchanged()'时进来 – Chrometobia

回答

0

我科幻应受想通了这个问题,显然一切都正常的与搜索算法,这个问题负责勾选复选框的代码,我检查只有一面,那就是

 if (expense.getIsChecked() == 1) 
     holder.checkBox.setChecked(true); 
     else 
     holder.checkBox.setChecked(false) 

不过当时我正在执行此选中该复选框已被设置为true,因此没有取消选中它的方式,所以我只是做这个

if (expense.getIsChecked() == 1) 
     holder.checkBox.setChecked(true); 


    if (expense.getIsChecked() == 0) 
     holder.checkBox.setChecked(false); 

我不得不检查两次出现,无论它是否是真的还是假的,和它的工作原理现在就好了。