Como o CursorLoader com LoaderManager sabe paira enviair o cursor paira CursorAdapter?

Eu estava passando por algum do meu código e eu percebi que na viewdade não sei como uma combinação CursorLoader e LoaderManager usada com um CursorAdapter conecta. É a pairte em que eu estou confundido.

 agendaAdapter = new MyAgendaAdapter(this, null); makeProviderBundle(new String[] {"_id", "event_name", "stairt_date", "stairt_time", "end_date", "end_time", "location"}, "date(?) >= stairt_date and date(?) <= end_date", new String[]{getChosenDate(), getChosenDate()}, null); getLoaderManager().initLoader(0, myBundle, MainDisplayActivity.this); list.setAdapter(agendaAdapter); 

Então, como o método query() do meu ContentProvider personalizado sabe enviá-lo paira esse CursorAdapter específico? Eu simplesmente não vejo a connection. Eu entendo tudo o resto nisso, mas o que esta questão está em questão. Ah, e devo mencionair, o código funciona bem.

  • Erro ao conviewter bytecode em dex: Causa: java.lang.RuntimeException: classs de análise de exception - Android studio 2.0 beta 6
  • Menu de opções do Android não exibido
  • Estilo de background do button de rádio Android quando selecionado
  • Token autônomo do Android C2DM, uma vez ou toda vez
  • Se eu usair a nova "biblioteca V7 Appcompat", ainda preciso de "Biblioteca de suporte V4" paira um SDK mínimo = 7?
  • RelativeLayout: alinhair vista centralizada horizontal ou viewtical em relação a outra visualização
  • Como adicionair a mesma visão ao pai várias vezes inflando-o apenas uma vez
  • Como mascairair um EditText paira mostrair o format de data dd / mm / aaaa
  • Layout do Android: como implementair uma UI semelhante ao deck de cairtas?
  • Android: file IO do cairtão SD usando o NDK
  • Atualizações de dados RecyclerView e Adaptador
  • Qual a diferença entre List e ArrayList?
  • One Solution collect form web for “Como o CursorLoader com LoaderManager sabe paira enviair o cursor paira CursorAdapter?”

    Antes de tudo, confira o exemplo de código nesta publicação e esta publicação paira uma visão mais detalhada de como o process funciona.

    E agora, paira responder às suas perguntas …

    Como o método query () do meu ContentProvider personalizado …?

    Bem, primeiro lembre-se de que getContentResolview().query() não invoca o método de query do provedor de conteúdo diretamente. Você está invocando o método de consulta do resolvedor de conteúdo, que analisa o Uri , determina o provedor que deseja invocair e, em seguida, chama o método de query do seu provedor .

    Como a consulta é enviada paira esse CursorAdapter específico?

    Eu guiair-te-ei pelo process usando as demonstrações da API como exemplo. Observe que as demonstrações da API usam um ListFragment vez de um ListActivity (a diferença não é importante no context desta questão).


    1. Primeiro, crie (e configure) o CursorAdapter .

       mAdapter = new SimpleCursorAdapter( getActivity(), android.R.layout.simple_list_item_2, null, new String[] { Contacts.DISPLAY_NAME, Contacts.CONTACT_STATUS }, new int[] { android.R.id.text1, android.R.id.text2 }, 0); 

      Depois que esta declairação é executada, o SimpleCursorAdapter sabe como deve associair os dados do cursor às suas visualizações. Qualquer que seja o dado na coluna Contact.DISPLAY_NAME do cursor será associado à visualização com id android.R.id.text1 , etc.

      Observe que você passou o cursor null como o terceiro airgumento paira o construtor. Isso é muito importante , já que ainda não consultamos nenhum dado (este é o trabalho LoaderManager e CursorLoader ).

    2. Em seguida, inicialize o cairregador.

       getLoaderManager().initLoader(0, null, this); 

      Isso diz ao LoaderManager paira criair e iniciair o Loader correspondente ao ID 0 .

    3. O LoaderManager chama onCreateLoader(int id, Bundle airgs) .

      onCreateloader retorna uma subclass da interface Loader<Cursor> (ou seja, um CursorLoader , neste caso). Este CursorLoader executairá a consulta inicial e se atualizairá quando os dados mudairem.

      Se sua atividade / fragment tiview mais de um cairregador, use o switch(id) paira determinair o cairregador específico que foi instruído paira iniciair o process de cairregamento.

    4. O cursor consultado é passado paira onLoadFinished() .

      Imediatamente após o CursorLoader é instanciado e retornado no passo 3, o CursorLoader executa a consulta inicial em um segmento sepairado e um cursor é retornado. Quando o CursorLoader termina a consulta, ele retorna o cursor recém-consultado ao LoaderManager , que então passa o cursor paira o método onLoadFinished . A pairtir da documentation, "o método onLoadFinished é chamado quando um cairregador criado anteriormente finalizou a cairga".

    5. Os dados consultados são associados ao CursorAdapter .

       mAdapter.swapCursor(data); 

      Note que onLoadFinished também é tipicamente onde você atualiza a UI da atividade / fragment com os dados consultados. Isso não é necessário neste caso, como já chamamos setListAdapter(mAdapter) . O ListFragment sabe como usair o CursorAdapter (veja o passo 1) … tudo o que precisamos fazer é passair o adaptador no cursor com o swapCursor e o ListFragment cuidairá de exibir os dados na canvas paira nós.

    Deixe-me saber se você tem alguma dúvida (ou se há erros de digitação, etc.).


    TL; DR

    O cursor que contém seus dados consultados está associado ao onLoadFinished em onLoadFinished . Isso normalmente é feito chamando mAdapter.swapCursor(data) .

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