2015-11-02 2 views
0

У меня есть токены ArrayList; Я добавляю значения к массиву с кликом listView. Прежде чем добавить значение в массив i, проверьте, существует ли значение уже существующего массива. я удалить значение она существует еще я добавлю значениеAndroid проверить, если значение равно значениям в массиве

Это, как я сделал, но значения не добавляются в массив

ArrayList<String> tokens; 
tokens = new ArrayList<String>(); 
... 
.... 
public void onItemClick(AdapterView<?> listView, View view, 
          int position, long id) { 
     Cursor cursor = (Cursor) listView.getItemAtPosition(position); 
     String selectedtoken = cursor.getString(cursor.getColumnIndexOrThrow("ContactToken")); 

     for (int i = 0; i < tokens.size(); i++) { 
       if (tokens.get(i).equals(id_To_Search)) { 
        tokens.remove(i); 
       } 
       else { 
        tokens.add(selectedtoken); 
       } 
      } 
    } 
... 
... 
Log.i("array: ", tokens.toString()); // No values in the array 
+1

я хотел бы предложить использовать набор, а затем преобразовать множество в ArrayList, когда вы сделали, это было бы намного легче –

ответ

3

Вы не добавляете, когда вы изначально есть 0 токенов.

Изменить на:

boolean removed = false; 
for (Iterator<String> iter = tokens.iterator(); iter.hasNext();) { 
    if (iter.next().equals(id_To_Search)) { 
     iter.remove(); 
     removed = true; 
    } 
} 
if(!removed) { 
    tokens.add(selectedtoken); 
} 
+2

Это будет терпеть неудачу с ConcurrentModificationException во многих случаях. .. и он всегда будет иметь выбранный токен в конце. –

+0

Я скорректировал второй, но первый ehhh, все это в потоке пользовательского интерфейса –

+1

Просто потому, что он в одном потоке не означает, что вы не получите 'ConcurrentModificationException'. См. Https://stackoverflow.com/questions/223918 –

2

Если список пуст, вы никогда не идут в петлю, так что вы никогда не будете называть add. Если у вас do есть какие-то маркеры, вы либо добавляете, либо удаляете новый токен для каждого существующего токена, который не то, что вы хотите.

Я подозреваю, что вы хотите:

int existingIndex = tokens.indexOf(selectedToken); 
if (existingIndex == -1) { 
    tokens.add(selectedToken); 
} else { 
    tokens.remove(existingIndex); 
} 

В качестве альтернативы, вы можете использовать Set<String> с:

// Speculatively try to remove it... and add it if you couldn't remove 
boolean removed = tokens.remove(selectedToken); 
if (!removed) { 
    tokens.add(selectedToken); 
} 

Также обратите внимание, что вы в настоящее время тестирования для id_To_Search, но затем добавить selectedToken - этот ответ предполагает вы на самом деле хотели использовать selectedToken в обоих местах.

1

Цикл for не будет выполняться, когда tokens.size() равен 0. Таким образом, вы никогда не добавите токен, потому что изначально список токенов пуст.

3

Вы можете просто проверить существование с помощью метода contains.

if(!tokens.contains(id_To_Search)){ 
    tokens.add(selectedtoken); 
} else { 
    tokens.remove(selectedtoken); 
} 
3

Вы проверка для каждого элемента в массиве, если это деталь вы собираетесь хранить/удалить, а затем делать правильную работу.

Сначала вы должны найти, если вы являетесь элементом во всем массиве, а затем добавляете или удаляете его.

попробовать что-то вроде этого:

public void onItemClick(AdapterView<?> listView, View view, 
         int position, long id) { 
    Cursor cursor = (Cursor) listView.getItemAtPosition(position); 
    String selectedtoken = cursor.getString(cursor.getColumnIndexOrThrow("ContactToken")); 

      if (tokens.contains(id_To_Search)) {  
       tokens.remove(id_To_Search); 

      } 
      else { 
       tokens.add(id_To_Search); 
      } 
} 
Смежные вопросы