2016-03-12 8 views
8

私は単純なリストビュー(recyclerView)を持っていますが、各リストアイテムにはチェックボックスがあります。チェックされているすべてのアイテムは、次のコードで削除する必要があります。ArrayList.remove(i)は、すべてのオブジェクトを削除しません。

for(int i = 0; i<shopListItems.size(); i++) { 
    if(shopListItems.get(i).isBought == 1) { 
     shopListItems.remove(i); 
    } 
} 

ただし、何らかの理由で削除されません。 10個のアイテムがチェックされている場合、そのうちの7個だけが削除され、残りのアイテムを削除するためにコードを再度実行する必要があります。

コードが細かいようだが、私は本当にそれが全てチェックや(isBought == 1)

+3

アイテム0を削除すると、古いアイテム1は位置0に移動しますが、ループは位置1に移動してループします。 –

答えて

18

remove(index)オブジェクトを削除しても、残りのすべてのオブジェクトは、ギャップを閉じるために左にシフトだけではなく、そのすべて削除いけない理由を理解しません。リストの最後から開始までを繰り返す必要があります

for(int i = shopListItems.size() - 1 ; i >= 0 ; i--) { 
    if(shopListItems.get(i).isBought == 1){ 
     shopListItems.remove(i); 
    } 
} 
+0

これで今すぐ試してみましょう。私は知らなかった.removeオブジェクトをシフト! – Muddz

+1

@Muddz https://docs.oracle.com/javase/7/docs/api/java/util/List.html#remove(int)このリスト内の指定された位置にある要素を削除します(オプションの操作)。後続の要素を左にシフトします(インデックスから1を引きます)。リストから削除された要素を返します。 – Yoda

+0

@Yodaリンクに感謝します。それを知っておくことが大切です!私はそれを考えなかった。もちろん、リストから何かを削除するとギャップがあり、このギャップは閉じなければなりません。 – Muddz

4

逆ループ!あなたは全体のArrayListを削除しようとされていない場合は

 for(int i = shopListItems.size() -1; i >=0 i--){ 
      if(shopListItems.get(i).isBought == 1){ 
       shopListItems.remove(i); 
      } 
     } 

、あなたはサイズが変化するにつれて、それはテストの残りの部分に影響を与えない、ので、心配する必要はありません。上記の方法に加えて

5

、あなたはまた、昇順でそれを行うことができます。

for(int i = 0; i < list.size(); i++){ 
    if(list.get(i).isBought == 1){ 
     list.remove(i--); 
    } 
} 

は、あなたは、Java 8を使用している場合は、別の簡単な選択肢があります:

list = list.stream() 
     .filter(item -> item.isBought == 1) 
     .collect(Collectors.toList()); 

リファレンス:http://zeroturnaround.com/rebellabs/java-8-explained-applying-lambdas-to-java-collections/

関連する問題