Recycler Android中的SearchVIew问题

时间:2016-06-10 12:44:28

标签: android android-recyclerview searchview

我正在开发一款跟踪某人费用的应用程序,用户会添加他们已购买的内容,并且会跟踪这些内容,费用会显示在回收者视图中,有时候会有太多项目和需要搜索因此我添加了一个工作只是找到的搜索功能,但因为处理费用,适配器有一个复选框,指示是否已支付费用,当我搜索一个项目并勾选它有已经支付了功能正常工作,但一旦我退出搜索模式我注意到一些东西,该项目回到其在列表中的原始位置但占据该位置的项目,先前修改的项目也继承了付费状态,它被勾选为也付出了代价,希望我的解释是有道理的,这里有一些屏幕截图来展示我的意思:

在第一个屏幕截图中我们有一个普通列表,但我会搜索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();


        }

1 个答案:

答案 0 :(得分: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);

我必须检查这两个事件,无论它是真还是假,现在它的效果都很好。