2011-10-24 69 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(); 

希望這有助於