ArrayAdapter: удалить по индексу - PullRequest
2 голосов
/ 06 августа 2011

У меня есть ListView, который заполняется кратким описанием сервера новостей (просто список фрагментов истории) и arrayAdapter для изменения этого ListView.

Я могу удалить элементы с помощью функции 'remove (Object)'но что, если есть несколько экземпляров объекта?remove () удаляет только первый экземпляр объекта.Я не могу удалить, например, второй «Объект» в моем адаптере массива, не удалив первый.Итак, мой вопрос: как я могу обойти это?

ex: Rundown A

story 1 
story 2
Break
story 3
story 4
Break
story 5
etc...

, поэтому в этом примере я не могу удалить второй 'Break', потому что remove ('Break') будетудалить первый.если бы я мог удалитьByIndex (5), это было бы идеально, но ....

Я попытался написать свою собственную функцию удаления, которая создает совершенно новый адаптер со всеми членами, кроме указанного индекса.вот с чем я возился.

public ArrayAdapter<String> removeIndex(ArrayAdapter<String> arr, int index) {
    ArrayAdapter<String> temp = new ArrayAdapter<String>(arr.getContext(),R.layout.list_item);
    for(int i =0 ; i<arr.getCount();i++){
        if(i != index) temp.add(arr.getItem(i));
    }
    return temp;
}

Помощь или предложения приветствуются.

1 Ответ

3 голосов
/ 06 августа 2011

Обработайте коллекцию строк самостоятельно с помощью List и передайте объект в конструктор ArrayAdapter. Это оставляет вам ссылку на список, так что вы можете изменять данные, позволяя адаптеру управлять им и отображать его по мере необходимости.

Примечание: При изменении объекта данных вы должны вызвать

myAdapter.notifyDataSetChanged()

впоследствии - которое также должно быть в потоке пользовательского интерфейса. Очевидно, что изменения в списке не должны происходить в потоке пользовательского интерфейса и, скорее всего, не произойдет в потоке пользовательского интерфейса.

private ArrayList<String> mData = new ArrayList<String>();
private ArrayAdapter<String> mAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // ...
    // Code that adds the strings
    // Create the list adapter
    mAdapter = new ArrayAdapter<String>(myActivity.this, android.R.layout.simple_list_item_1, mData);
}

private void removeItem(int index) {
    mData.removeAt(index);
    myActivity.this.runOnUiThread(new Runnable() {
        public void run() {
            mAdapter.notifyDataSetChanged();
        }
    }
}
...