Обновление ListView с помощью notifydataSetChanged, должно использовать runOnUiThread? - PullRequest
2 голосов
/ 27 июля 2011

Итак, у меня есть этот ListView, который использует мой собственный массивный адаптер. Он отлично работает, получает данные из базы данных и т. Д., Но после его установки обновление не происходит. У меня есть эта деятельность, которая делает что-то для результата, и когда он возвращается, я называю это:

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) 
    {
        super.onActivityResult(requestCode, resultCode, data);          
        if(requestCode==1899)
        {       
            //a new client was added to the list...
            try {
                clients = (ArrayList<ClientsData>) clientsDataDao.queryForAll();
            } catch (SQLException e) {
                // TODO Auto-generated catch block

            }                           
            theClients.notifyDataSetChanged(); //this is not working here                           
            showClientDetails(mCurrentSelectedItemIndex); //update other fragment.
        }
    }

Проблема в том, что notifyDataSetChanged() на самом деле ничего не делает. Я продолжил расследование, и я думаю, это должно быть вызвано в потоке пользовательского интерфейса? но я в FragmentActivity, и я не уверен, как это сделать? Возможно, мне придется создать работающий поток и вызвать его оттуда? Не много сделали с потоками, так что не уверены, у кого-нибудь есть хорошие (лаконичные и полные) примеры того, как это сделать? или это даже моя проблема?

(Примечание: я переключился на ORM Lite, до этого у меня в этом конкретном месте было SimpleCursorAdapter, которое я мог обновить после вызова .requery на моем курсоре, а затем notifyDataSetChanged()

EDIT:

Хорошо, после нескольких комментариев я исследовал маршрут AsyncTask ...:

private class addViewsToList extends AsyncTask<Void, Void, Boolean>{
         protected void onPostExecute(Boolean result) {
                theClients.notifyDataSetChanged();
            }
        @Override
        protected Boolean doInBackground(Void... params) {
            // TODO Auto-generated method stub
            return true;
        }         
    }

а по моему onActivityCreated:

new addViewsToList().execute();

и на моем onActivityResult(...):

super.onActivityResult(requestCode, resultCode, data);          
        if(requestCode==1899)
        {       
            //a new client was added to the list...
            try {
                clients = (ArrayList<ClientsData>) clientsDataDao.queryForAll();
            } catch (SQLException e) {
                // TODO Auto-generated catch block

            }       
                            //do I have to reset the adapter?   
            setListAdapter(theClients);             
                        showClientDetails(mCurrentSelectedItemIndex);
        }

Все еще нет обновлений в списке ...

Итак, я продемонстрировал, что понятия не имею, что я делаю :)

1 Ответ

1 голос
/ 27 июля 2011

Действительно, вы должны сделать Runnable.

Как?Повторно введите адаптер, где вы обновляете новые данные (я предполагаю, что вы хотите что-то изменить в просмотре списка), а затем вызовите notifyDataSetChanged() в runnable.На самом деле вам нужно runOnUIThread(), потому что вы запускаете обновления для пользовательского интерфейса.Или используйте AsyncTask, где вы обновляете представление списка в onPostExecute() или onProgessUpdate() методах.

...