2011-10-24 48 views
3

我是从同一个问题深受其害这个问题时,错误项检查:Wrong item checked when filtering ListView in android安卓:过滤列表视图

如上问题的建议,我有一个持有的Hashset所有selectedIds,但我想不通了解如何在光标正在重新填充选中的项目时使用它。

我的问题只是化妆品 - 例如:

  • “脸谱”位于未过滤列表中的第5位。
  • 用户搜索“脸”,只有“Facebook”出现在过滤列表中的第一个位置。
  • 用户选中“Facebook”并选回未过滤列表。
  • 选中的项目是列表中的第一个项目,而不是“Facebook”(位于第5个)。

注: 除了这个问题,一切的伟大工程。 例如,“删除”将删除正确的项目,因为我使用selectedIds来执行它(即使检查的项目是错误的)。

一个列表项单点击:

OnItemClickListener mOnItemClickListener = new OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 

       //gets the Bookmark ID of selected position 
        Cursor cursor = (Cursor)parent.getItemAtPosition(position); 
        String bookmarkID = cursor.getString(0); 

        boolean currentlyChecked = checkedStates.get(position); 
        checkedStates.set(position, !currentlyChecked); 

        if (!selectedIds.contains(bookmarkID)) { 

         selectedIds.add(bookmarkID); 
         selectedLines.add(position); 

        } else { 

         selectedIds.remove(bookmarkID); 
         selectedLines.remove(position); 


         } 

      } 
     }; 

光标内部: - 这就是问题所在。

这重新填充检查的项目 - 问题是它通过位置(pos)和项目在过滤列表中的正确位置是什么,不是它在未过滤列表中的位置 - 导致错误标记项目。

CheckedTextView markedItem = (CheckedTextView) row.findViewById(R.id.btitle); 
markedItem.setChecked(checkedStates.get(pos)); 

希望得到任何帮助!

回答

0

解决了这个问题。 正如我添加到我的问题中所建议的那样,当您填充复选框时,其他List/Hashset应确定是否将item标记为已选中或未选中。

使用我的代码:

//first you will need to get the current item ID 
String bookmarkID = cursor.getString(0); 

//Then, check if the current ID is in the selectedIds hash/list 
//If true - mark current item view as checked, else - uncheck. 
     CheckedTextView markedItem = (CheckedTextView) row.findViewById(R.id.btitle); 
     if (selectedIds.contains(new String(bookmarkID))) { 
      markedItem.setChecked(true); 

     } else { 
      markedItem.setChecked(false); 
} 

真希望这将帮助任何人!:)

+0

我对执行这个有点困惑。我有一个带有listview的SimpleCursorAdapter。你如何初始化checkedStates,selectedIds和selectedLines? 此外,答案中提到的列表/哈希集确定项目是否需要自定义适配器或我可以使用SimpleCursorAdapter? – rohitmishra

+0

@movingahead无法真正在这里发布代码(解决了问题)...要么开始一个新的问题或给我发电子邮件(我的昵称在Gmail),我会尽力帮助。 –

+0

我在这里问了一个新问题http://stackoverflow.com/questions/9399941/implementing-a-listview-with-multiple-select-with-filter-using-a-cursor-adapter如果你能提供帮助,情况会很好。 – rohitmishra

1

难道简单地说你ListView不知道数据集已更改?调用适配器上的notifyDatSetChanged()以通知它。

my_adapter.notifyDataSetChanged(); 

这将强制重新绘制列表和更新的数据。

+0

它知道。不幸的是,这不是问题。 –

0

这是我的解决方案:

  • 要selecte中筛选之后所得列表视图中的项目,刚开始时,我得到了错误的项目,因为我用这个:

    ItemData item = listItems.get(position); 
    

正确的方法应该是这样的:

ItemData item = (ItemData) parent.getItemAtPosition(position); 
  • 要删除一个项目后过滤,我已经试过这样:

    for(int i=0;i<listItems.size();i++){ 
        if(listItems.get(i).getItemID() == item.getItemID()){ 
         listItems.remove(i); 
         myAdapter.notifyDataSetChanged(); 
        } 
    } 
    

但是这并没有因为我的自定义适配器工作。在我的自定义适配器,使用过滤器,我有两个时listItems:

ArrayList<ItemData> listItemsToShow = new ArrayList<ItemData>(); 
    ArrayList<ItemData> listItemsBackup = new ArrayList<ItemData>(); 

所以要删除一个项目,我在我的自定义适配器增加了新的方法:

public void deleteItem(String itemID) { 
    for (int i = 0; i < listItemsToShow.size(); i++) { 
     if (listItemsToShow.get(i).getId().equals(itemID)) { 
      listItemsToShow.remove(i); 
      break; 
     } 
    } 

    for (int i = 0; i < listItemsBackup.size(); i++) { 
     if (listItemsBackup.get(i).getId().equals(itemID)) { 
      listItemsBackup.remove(i); 
      break; 
     } 
    } 

最后以删除列表中的项目观点:

subjectBaseAdapter.deleteItem(subject.getId()); 
    subjectBaseAdapter.notifyDataSetChanged(); 

希望这有助于