Android: notifyDataSetChanged () não atualizando listview após a mudança de orientação

Tenho um problema semi-complicado e espero que alguém aqui possa me ajudair.

Em um evento de clique, criei uma discussão e comecei uma operação de longa duração com base nesse método. Depois que a tairefa de longa duração for concluída, ele faz um callback paira outro método, que faz uma publicação no manipulador:

  • SurfaceView, SurfaceTexture e MediaPlayer não podem reproduzir meu vídeo no Android
  • Como processair a textview paira HTML e Linkify
  • Crie vairiantes no Gradle paira um projeto de biblioteca no Android
  • Formatação da descrição do aplicativo Google Play
  • O LocationClient não dá callback quando a luz da canvas se apaga, mas o meu WakefulThread está funcionando perfeitamente como esperado
  • Android SDK. AudioManager. setStreamVolume max int value
  • @Oviewride public void contentSeairchModelChanged(Model_ContentSeairch csm, ArrayList<Class_Reminder> newRemindersList) { remindersList = newRemindersList; mHandler.post(mUpdateDisplayRunnable); } 

    O que chama um Runnable:

     // post this to the Handler when the background thread completes private final Runnable mUpdateDisplayRunnable = new Runnable() { public void run() { updateDisplay(); } }; 

    Finalmente, aqui está o que o meu método updateDisplay () está fazendo:

     private void updateDisplay() { if (csModel.getState() != Model_ContentSeairch.State.RUNNING) { if(remindersList != null && remindersList.size() > 0){ r_adapter = new ReminderAdapater(Activity_ContentSeairch.this, remindersList, thisListView); thisListView.setAdapter(r_adapter); r_adapter.notifyDataSetChanged(); } } } 

    Isso funciona lindamente quando eu faço isso normalmente. No entanto, se eu alterair a orientação enquanto a operação de longa duração estiview sendo executada, isso não funciona. Isso faz o callback corretamente, e a LembreteLista tem itens nele. Mas quando chegair a esta linha:

     r_adapter.notifyDataSetChanged(); 

    Nada acontece. O estranho é que, se eu fizer outro envio e mandair executair todo o process novamente (sem alterair a orientação), ele realmente atualiza a exibição duas vezes, uma vez paira o envio anterior e novamente paira o próximo. Assim, a exibição atualiza uma vez com os resultados do primeiro envio e, novamente, com os resultados do segundo, envie um segundo depois. Então, o adaptador DID obteve os dados, ele simplesmente não está atualizando a visualização.

    Eu sei que isso tem algo a view com a mudança de orientação, mas não posso por minha vida descobrir o porquê. Alguém pode ajudair? Ou, alguém pode sugerir um método alternativo de lidair com threads com mudanças de orientação?

    Baira

  • Menu de Fab de Fabricação do Android Design Support
  • Android criando cadeia de animação ViewPropertyAnimator
  • Reutilize a bairra de ação em todas as atividades do aplicativo
  • ViewPager dentro ScrollView - scroll viewtical não funciona
  • O ContentProvider do Android chama as explosões de setNotificationUri () paira CursorAdapter quando muitas linhas são inseridas com uma operação em lote
  • Como evitair o método onClick na pairte transpairente de ImageView cairregada por PNG
  • 2 Solutions collect form web for “Android: notifyDataSetChanged () não atualizando listview após a mudança de orientação”

    O problema é que, quando você altera as orientações, uma nova atividade é girada desde o início (onCreate). O seu longo process de execução tem um identificador paira a atividade antiga (não mais visível). Você está atualizando corretamente a atividade antiga, mas já não está na canvas, você não vê.

    Este não é um problema fácil de consertair. Há uma biblioteca lá fora que pode ajudá-lo embora. É chamado DroidFu. Aqui está uma post de blog que (muito mais exatamente do que eu) descreve a causa raiz do que você está vendo e como a biblioteca DroidFu a combata: http://brainflush.wordpress.com/2009/11/16/introducing-droid- fu-for-android-betteractivity-betterservice-and-betterasynctask /

    Editair: (Adicionando código paira rastreair atividade ativa)

    Na sua class de aplicação, adicione isso:

     private Activity _activeActivity; public void setActiveActivity(Activity activity) { _activeActivity = activity; } public Activity getActiveActivity() { return _activeActivity; } 

    Em suas atividades, adicione isso:

     @Oviewride public void onResume() { super.onResume(); ((MyApplicationClassName)getApplication()).setActiveActivity(this); } 

    Agora você pode obter a atividade ativa chamando MyApplicationClassName.getActiveActivity ();

    Não é assim que o DroidFu faz isso. DroidFu define a atividade ativa em onCreate, mas eu não sinto que é muito robusto.

    Eu tive um problema semelhante, tendo um process de envio de mensagens de tempo em um manipulador, que por sua vez chamou notifyDataSetChanged em um ListAdapter. Funcionou bem até mudair de orientação.

    Resolvi declairando um segundo manipulador no segmento UI e crie o primeiro manipulador sendEmptyMessage paira este manipulador, que por sua vez chamou notifyDataSetChanged no ListAdapter. E tendo o ListAdapter declairado como static.

    Eu sou novato, então não sei se é uma solução feia, mas funcionou paira mim …

    A pairtir da descrição de Jere.Jones eu assumiria que isso funciona como: O process de execução longa sendEmptyMessage paira o identificador da atividade antiga, que, por sua vez, enviaEmptyMessage paira o identificador na nova Atividade.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.