2017-07-18 148 views
1

該代碼在Java中工作,但在轉換爲Kotlin時不再有效。它拋出一個IndexOutOfBoundsException從列表中拋出拋出異常時拋出IndexOutOfBoundsException:Java-> Kotlin

這裏是原始的Java:

grid_view.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
      String selectedItem = ((TextView) view.findViewById(R.id.tag_name)).getText().toString(); 
      for (int j = 0; j < itemList.size(); j++){ 
       String tempString = itemList.get(j); 
       if(tempString.equals(selectedItem)) { 
        Log.d("Update", "Removing: " + selectedItem); 
        itemList.remove(j); 
       } 
      } 
     } 
    }); 

這是新科特林:

grid_view!!.onItemClickListener = AdapterView.OnItemClickListener { _, _, _, _ -> 
      val selectedItem = (tag_name as TextView).text.toString() 
      itemList.indices.forEach { 
       val tempString = itemList[it] 
       if (tempString == selectedItem) { 
        Log.d("Update", "Removing: " + selectedItem) 
        itemList.removeAt(it) 
       } 
      } 
    } 

回答

3

由於indices在第一時間被初始化,所以forEach操作indices後從未改變您從List刪除元素,但size()是用Java改變,例如:

//       v--- `size` is changed after remove item from List 
for (int j = 0; j < itemList.size(); j++){ 
    //... 
} 

對於科特林易變的操作,請使用 MutableCollection#removeIf/MutableCollection#removeAll代替,例如:

itemList.removeIf { it == selectedItem } // java-8 

itemList.removeAll { it == selectedItem } // Kotlin 

存在的Java代碼錯誤的邏輯,例如:

for (int j = 0; j < itemList.size(); j++){ 
    String tempString = itemList.get(j); 
    if(tempString.equals(selectedItem)) { 
     itemList.remove(j--); 
     //    ^
     // you should minus the current j, if don't the next is skipped 
    } 
} 
+0

謝謝,這個例外不再被拋出。但是,它仍然不像以前那樣行事。無論grid_view中哪個項目被點擊,第一項都被刪除。日誌語句顯示selectedItem始終是第一個。 – Roc47HS

+0

@ Roc47HS嗨,我不擅長英語。請說清楚,先生。 :) –

+0

抱歉,不清楚。 grid_view應該在點擊某個項目時將其從列表和grid_view中移除。這就是它在原始Java代碼中的表現。現在在Kotlin中,即使我點擊grid_view中的第二個或第三個項目,它也會刪除第一個項目。 – Roc47HS