Проблема при обновлении listView: UnsupportedOperationException - PullRequest
0 голосов
/ 03 апреля 2011

почему я не могу обновить / перезагрузить свой ListView? Я написал приложение, которое считывает html-сайты, сохраняет информацию в String-Array и представляет ее в моем ListView. Но каждый раз, когда я закрываю и снова открываю приложение, новый контент добавляется к существующему контенту. В первый раз я получаю, э. например, «1 2 3 4» и во втором прогоне «1 2 3 4 1 2 3 4», затем «1 2 3 4 1 2 3 4 1 2 3 4» и т. д. Я много гуглю и нахожу способы очистить ArrayAdapter (aa) и пополнить его новыми данными -> aa.clear () / aa.setModifyDataChanged () / aa.remove (объект String) / aa.add (String) но каждый раз, когда я вызываю один метод, мое приложение закрывается принудительно, и LogCat показывает исключение: java.lang.UnsupportedOperationException. Зачем? Это действительно размалывает мои механизмы. Весь субботний день я пытаюсь это исправить - без успеха ... Может быть, кто-нибудь может мне помочь!?

Вот мой код-фрагмент

общедоступный класс расширяет ListActivity {

private static final int AKTUALISIEREN = 0;

private static ArrayList<String> al = new ArrayList<String>();
static String[] TST;
static ArrayAdapter<String> ad;

public boolean onOptionsItemSelected(MenuItem item)
{
    switch (item.getItemId())
    {
    case AKTUALISIEREN:
    getIt();
        //here a ad.close does a force close 
        setListAdapter(ad);
        ListView lv = getListView();
        lv.setTextFilterEnabled(true);  
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }

}

public void onCreate(Bundle savedInstanceState) {  

    super.onCreate(savedInstanceState);
    getIt();
    ad = new ArrayAdapter<String>(this, R.layout.list_item, TST);
    setListAdapter(ad);
    // here, when I try ad.clear() my app does a force close
    ListView lv = getListView();
    lv.setTextFilterEnabled(true);   
}

public static void getIt ()
{
    // Here I get the source-code of the html-site and parse my content
    // All necessary Information I write in my String Array TST, declared above in a static way        
}

Надеюсь, кто-нибудь может мне помочь ... Большое спасибо и хорошее воскресенье.

Ответы [ 2 ]

1 голос
/ 03 апреля 2011

Вам необходимо поддержать ArrayAdapter на ArrayList или List, а не на массиве фиксированного размера - размер массива фиксированного размера не может измениться и не может быть очищен (без его повторного создания, который по умолчанию целиком)

Поэтому установите содержимое вашего адаптера на al, а не TST (на заметку о том, что вы действительно должны называть свои переменные разумными именами). Затем вызовите al.clear(), al.add(String), чтобы изменить набор данных, поддерживающий адаптер. Как только набор данных был изменен, вызовите ad.notifyDataSetChanged - это приведет к тому, что адаптер списка и список обновят отображение.

Также ваш адаптер не должен быть статическим (и не должен TST или al, вероятно) - это приведет к утечкам памяти, так как адаптер удерживает ссылку на текущий контекст. НИКОГДА не создавайте ничего со статическим контекстом (drawables, адаптеры и т. Д.). Если вы не знаете, почему хотите, чтобы что-то было статичным, сохраняйте его как нормальную переменную.

0 голосов
/ 03 апреля 2011

очистить TST при каждом обновлении списка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...